2010-01-20 11 views
7

Per lo sfondo a questa domanda, vedere “How to I serialize a large graph of .NET object into a SQL Server BLOB without creating a large buffer?” che ha ora un gran taglia su di esso.Come eseguire il flusso di dati da/a campi BLOB di SQL Server?

desidero poter utilizzare un oggetto Stream per leggere/scrivere dati a/da un campo BLOB fila SQL Server senza dover mettere le tutti i dati in un buffer temporaneo.


Se quanto sopra può essere fatto ...

Come la classe Streams ha molte CanXXX() metodi, non tutti i corsi d'acqua possono essere utilizzati da tutti i metodi di prendere accettare ingressi di flusso/uscite.

Quindi, in che misura un flusso deve funzionare con ADO.NET quando si inviano dati a/da SQL Server?


Sto cercando di avere un flusso standard al quale posso passarlo su altre API.

Anche i due risposte finora riguarda solo ottenere sotto forma di dati SqlServer, non invio i dati da SqlServer.

+2

Sono arrivato a questa domanda quando stavo cercando la stessa cosa qualche giorno fa. Trovato soluzione di lavoro completa qui: http://www.syntaxwarriors.com/2013/stream-varbinary-data-to-and-from-mssql-using-csharp/ – JensB

risposta

1

Non mettere tutti i dati in un buffer; in genere esegui un ciclo, bufferizzando più di 8040 byte (in relazione alle dimensioni della pagina), aggiungendo il BLOB ogni volta WRITETEXT/UPDATETEXT per image o UPDATE.WRITE per varbinary(max). Here's an older example (utilizza image, scusa).

Allo stesso modo, quando si leggono i dati, si spera che si pompino i dati in un piccolo buffer verso un'altra destinazione (una risposta HTTP, una rete, un file, ecc.). Qualcosa like this (anche se non mi piace come gestisce il suo EOF/chunking, controllerei + ve byte letti).

+0

L'esempio legge i dati da un FileStream e li legge su SqlServer, Posso avere un flusso che posso passare ad altre API che scrivono sul flusso e avere i dati messi sullo SqlServer –

+0

@Ian: in questo caso, hai indagato su 'SqlFileStream' e SQL Server 2008? Forse vedi http://www.aghausman.net/dotnet/saving-and-retrieving-file-using-filestream-sql-server-2008.html –

+0

Non penso che saremo in grado di far aggiornare tutti i nostri clienti a Sql Server 2008, altrimenti SqlFileStream funzionerebbe molto bene per noi. –

5

Ecco un esempio per la lettura dei dati in blocchi:

using (var conn = new SqlConnection(connectionString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     cmd.CommandText = "select somebinary from mytable where id = 1"; 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       byte[] buffer = new byte[1024]; // Read chunks of 1KB 
       long bytesRead = 0; 
       long dataIndex = 0; 
       while ((bytesRead = reader.GetBytes(0, dataIndex, buffer, 0, buffer.Length)) > 0) 
       { 
        byte[] actual = new byte[bytesRead]; 
        Array.Copy(buffer, 0, actual, 0, bytesRead); 
        // TODO: Do something here with the actual variable, 
        // for example write it to a stream 
        dataIndex += bytesRead; 
       } 
      } 

     } 
    } 
+0

Sto cercando di avere un flusso standard per poterlo passare ad altre API. –

+0

In realtà, è documentato come ideale per lavorare in blocchi di 8040 byte. Inoltre non sono sicuro di cosa stai provando a fare copiando il buffer ogni iterazione. –

+0

Sto copiando il buffer sulla variabile 'actual' a seconda dei byte effettivi letti poichè potrebbe contenere meno byte della sua dimensione. –

Problemi correlati