2010-01-20 15 views
7

Para el trasfondo de esta cuestión, ver “How to I serialize a large graph of .NET object into a SQL Server BLOB without creating a large buffer?” que ahora tiene una gran recompensa por ello.Cómo transmitir datos desde/hacia los campos BLOB de SQL Server?

Deseo ser capaz de utilizar un objeto Stream para leer/escribir datos desde/hacia un campo BLOB en una fila de SQL Server sin tener que poner los todos los datos en una memoria intermedia temporal.


Si lo anterior se puede hacer ...

medida que la clase Corrientes tiene mucha CanXXX() métodos, no todas las corrientes pueden ser utilizadas por todos los métodos de tomar aceptar entradas de corriente/salidas.

Entonces, ¿qué capacidad tiene una secuencia para trabajar con ADO.NET al enviar datos a/desde SQL Server?


Estoy buscando tener una transmisión estándar a la que pueda pasarla a otras API.

También las dos respuestas hasta ahora solo cubren la obtención de datos de SqlServer, no enviando los datos a SqlServer.

+2

Llegué a esta pregunta cuando estaba buscando lo mismo hace unos días. Se encontró una solución de trabajo completa aquí: http://www.syntaxwarriors.com/2013/stream-varbinary-data-to-and-from-mssql-using-csharp/ – JensB

Respuesta

1

No pondría todos los datos en un búfer; por lo general, se ejecuta un bucle, se almacena en el búfer un múltiplo de 8040 bytes (relacionado con el tamaño de página), se agrega el BLOB cada vez WRITETEXT/UPDATETEXT para image, o UPDATE.WRITE para varbinary(max). Here's an older example (usa image, lo siento).

Del mismo modo, al leer los datos se espera que se bombeen datos en un pequeño búfer a algún otro destino (una respuesta http, una red, un archivo, etc.). Algo like this (aunque no me gusta mucho cómo maneja su EOF/fragmentación, yo vería + ve bytes leídos).

+0

El ejemplo de datos de lectura de un FileStream luego lo lee en SqlServer, Tengo un Stream que puedo pasar a otras API que escriben en el Stream y los datos se ponen en el SqlServer –

+0

@Ian. En ese caso, ¿ha investigado 'SqlFileStream' y SQL Server 2008? Quizás vea http://www.aghausman.net/dotnet/saving-and-retrieving-file-using-filestream-sql-server-2008.html –

+0

No creo que podamos conseguir que todos nuestros clientes actualicen a Sql Server 2008, de lo contrario, SqlFileStream funcionaría muy bien para nosotros. –

5

He aquí un ejemplo para la lectura de datos en fragmentos:

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

Estoy buscando tener un Stream estándar para poder pasarlo a otras API. –

+0

En realidad, está documentado como ideal para trabajar en trozos de 8040 bytes. Tampoco estoy seguro de lo que intenta hacer al copiar el búfer en cada iteración. –

+0

Estoy copiando el búfer a la variable 'real' en función de los bytes reales leídos, ya que puede contener menos bytes que su tamaño. –

Cuestiones relacionadas