Domanda

Vorrei leggere i dati binari da un BLOB, usando l'interfaccia Stream attorno ad esso.

Ma non voglio che il BLOB debba essere caricato interamente sul lato client e archiviato in memoria o in un file.

Voglio che il codice che utilizza il BLOB sia in grado di cercare e leggere, e solo il numero di dati necessari per supportare la ricerca / lettura viene trasferito via cavo.

vale a dire. Pretend il BLOB è un'immagine Photoshop da 250 MB. Il codice del thumbnailer sa come leggere i primi 8 byte di un'immagine, riconoscere che è un file PSD, cercare l'offset che conterrà la miniatura 3k e leggerlo.

Quindi, piuttosto che tentare di allocare 250 MB di memoria, o dover creare un file temporaneo, e dover aspettare che 250 MB vengano trasferiti via cavo: l'ipotetica classe SQLServerBlobStreamServerCursor sa come indirizzare il traffico verso ciò che viene effettivamente richiesto .


Ricerca

COME: Leggere e scrivere un file da e verso una colonna BLOB usando Chunking in ADO.NET e Visual Basic .NET Il che parla della capacità di leggere e scrivere a pezzi. Ma il codice è illeggibile essendo tagliato in quel modo non lo sopporto. lo guarderò più tardi.

Anche questo ragazzo ha menzionato un nuovo SQL Server 2005 [< em> colonna .Write ()] 3 sintassi T-SQL per scrivere dati - può essere utilizzato per scrivere dati in piccoli blocchi (per evitare di consumare tutta la memoria del server). Forse c'è una [ colonna ]. Leggi () pseudo-metodo

Microsoft ha un articolo: Conservazione delle risorse durante la scrittura di BLOB Valori per SQL Server

È stato utile?

Soluzione

Con le versioni più recenti di SQL Server è possibile utilizzare semplicemente SQL con la funzione SUBSTRING () su tipi di dati binari e testo. Vedi http://msdn.microsoft.com/en-us/library/ms187748 aspx

Per ottenere la dimensione dell'immagine:

select datalength(blobcolumn) from myimages where imgid = 12345;

Per leggere i primi 8 byte:

select substring(blobcolumn, 1, 8) from myimages where imgid = 12345;

Per leggere 877 byte, offset da 115000 a 115876:

select substring(blobcolumn, 115001, 877) from myimages where imgid = 12345;

Ricorda che la funzione di sottostringa si basa su un offset 1, non su 0.

Se ti interessa che la colonna cambi potenzialmente tra la lettura di parti di essa, puoi inserire tutte le diverse selezioni all'interno di una transazione.

Questo non è stato testato da me, ma le versioni precedenti di MS SQL Server richiedono apparentemente l'uso della verbo READTEXT (ora deprecato) e della funzione TEXTPTR (). Come ad esempio:

select textptr(blobcolumn) from myimages where imgid = 12345;

prendi il valore del puntatore restituito, ad esempio PTR, e usalo nelle query successive:

readtext blobcolumn @PTR 115001 887

Altri suggerimenti

Puoi prendere in considerazione l'utilizzo della nuova funzionalità FileStream di SQL Server 2008 per questo: http: / /msdn.microsoft.com/en-us/library/cc645940.aspx

Dovrai usare l'oggetto SqlDataReader di ADO.NET con SequentialAccess CommandBehavior. Ciò ti consentirà di definire una dimensione del buffer e leggere i dati in blocchi.

Vedi questo articolo: http: // msdn. microsoft.com/en-us/library/87z0hy49(VS.71).aspx

byte[] outbyte;
int bufferSize = 8;
SqlDataReader myReader = myCmd.ExecuteReader(CommandBehavior.SequentialAccess);
...
long returnBytes = myReader.GetBytes(1, 0, outbyte, 0, bufferSize);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top