Потоковая передача VARBINARY данных с SQL Server в C # - PullRequest
12 голосов
/ 18 февраля 2011

Я пытаюсь обслужить данные изображения, хранящиеся в поле VARBINARY (MAX) в базе данных, используя ASP.Net. Прямо сейчас код заполняет таблицу данных, затем извлекает байтовый массив из DataRow и помещает байтовый массив в ответ. Мне интересно, есть ли способ более или менее потоковой передачи данных с SQL Server в ответ без необходимости маршалировать вокруг этих огромных байтовых массивов (поскольку изображения большие, они вызывают исключения OutOfMemoryExceptions). Есть ли класс / механизм для этого?

Текущий код выглядит примерно так:

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();
}

Заранее спасибо - любая помощь приветствуется.

Ответы [ 2 ]

21 голосов
/ 18 февраля 2011

См. Загрузка и выгрузка изображений с SQL Server для статьи, посвященной этой теме, включая семантику эффективной потоковой передачи. Вы должны использовать SqlDataReader, открытый с CommandBehavior.SequentialAccess:

SequentialAccess Предоставляет способ DataReader для обработки строк, которые содержат столбцы с большим двоичным ценности. Вместо загрузки всей строка, SequentialAccess включает DataReader для загрузки данных в виде потока. Затем вы можете использовать GetBytes или Метод GetChars для указания байта место для начала операции чтения, и ограниченный размер буфера для данных возвращается.

В связанной статье представлен полный код для создания потока, поддерживаемого SqlDataReader, вы можете просто Stream.CopyTo(HttpResponse.OutputStream) или использовать кусочную копию байта [], если вы У меня еще нет .Net 4.0.

В следующей статье объясняется, как использовать столбец FILESTREAM для эффективной потоковой передачи больших VARBINARY-данных в базу данных и из нее.

0 голосов
/ 17 июля 2019

@ Ответ Ремуса, приведенный выше, устарел, поскольку .NET 4.5 представила первоклассную SqlClient Streaming . Больше нет необходимости обращаться к методам GetBytes () SqlDataReader для получения потока из SQL-запроса.

Теперь вы просто вызываете SqlDataReader.GetStream (int) , чтобы получить поток через столбец BLOB-объектов.

...