Потоковая передача данных VARBINARY из SQL Server в C#

Я пытаюсь обслуживать данные изображения, хранящиеся в поле 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();
}

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

1 ответов


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

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

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

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