Потоковая передача данных 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 вход и выход из базы данных.