2011-02-18 16 views
11

Estoy tratando de publicar datos de imágenes almacenados en un campo VAR (V) (MAX) en la base de datos utilizando ASP.Net. En este momento, el código está llenando una tabla de datos, luego sacando la matriz de bytes del DataRow y empujando la matriz de bytes en la respuesta. Me pregunto si hay una manera de transmitir más o menos los datos del servidor SQL a la respuesta sin tener que desplazarlos por estas enormes matrices de bytes (dado que las imágenes son grandes, causan OutOfMemoryExceptions). ¿Hay una clase/mecanismo para eso?Transmisión de datos VARBINARIOS desde SQL Server en C#

El código actual se ve más o menos así:

DataTable table = new DataTable(); 
SqlDataAdapter adapter = new SqlDataAdapter(commandText, connectionString); 
adapter.Fill(table); 
DataRow row = table.Rows[0]; 
byte[] imageData = row[0] as byte[]; 
if(imageData != null) 
{ 
    Response.Clear(); 
    Response.BinaryWrite(imageData); 
    Response.End(); 
} 

Gracias de antemano - cualquier ayuda se agradece.

+0

¿Ha intentado utilizar directamente un SqlDataReader? –

Respuesta

18

Consulte Download and Upload Images from SQL Server para obtener un artículo sobre el tema, incluida la semántica de transmisión eficiente. Debe utilizar un SqlDataReader abrió con CommandBehavior.SequentialAccess:

SequentialAccess Proporciona una manera para el DataReader para manejar filas que contener columnas con grandes valores binarios. En lugar de cargar toda la fila , SequentialAccess habilita el DataReader para cargar datos como una secuencia. A continuación, puede utilizar los GetBytes o método GetChars para especificar un byte ubicación para iniciar la operación de lectura, y un tamaño de búfer limitado para los datos que se devuelven .

El artículo enlazado proporciona código completo para la creación de una corriente respaldado por un SqlDataReader, puede simplemente Stream.CopyTo(HttpResponse.OutputStream), o utilizar un byte [] copia fragmentada, si usted no tiene .Net 4.0 todavía.

Este artículo de seguimiento explica how to use a FILESTREAM column for efficient streaming of large VARBINARY data dentro y fuera de la base de datos.

+0

Sí, eso es lo que estaba buscando - gracias @remus – mhildreth

+0

¿Hay mucho beneficio implementando SqlReaderStream desde el artículo que vincula que simplemente haciendo una copia fragmentada de bytes [] directamente usando SqlDataReader.GetBytes? Parece que en .NET 4.5 ahora hay un método SqlDataReader.GetStream. – Michael

+0

@Michael: Las clases de flujo en mi artículo son necesarias principalmente debido a la gestión de por vida, ya que el momento en que se crea la secuencia (controlador) no es cuando se usa la secuencia (respuesta) y tienen que disponer adecuadamente los recursos. –

Cuestiones relacionadas