在C#中从SQL Server流式传输VARBINARY数据

mhi*_*eth 12 c# sql stream varbinary

我正在尝试使用ASP.Net提供存储在数据库中VARBINARY(MAX)字段中的图像数据.现在,代码填充数据表,然后将字节数组拉出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();
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢 - 任何帮助表示赞赏.

Rem*_*anu 21

有关该主题的文章,请参阅从SQL Server下载和上载映像,包括高效的流式语义.你必须使用一个SqlDataReader打开CommandBehavior.SequentialAccess:

SequentialAccess 为DataReader提供一种处理包含具有大二进制值的列的行的方法.SequentialAccess不是加载整行,而是使DataReader能够将数据作为流加载.然后,您可以使用GetBytes或GetChars方法指定用于启动读取操作的字节位置,以及用于返回数据的有限缓冲区大小.

链接的文章提供了用于创建由SqlDataReader支持的Stream的完整代码,您可以简单地使用byte [] chunked copy,如果您还没有.Net 4.0.Stream.CopyTo(HttpResponse.OutputStream)

这篇后续文章解释了如何使用FILESTREAM列有效地将大型VARBINARY数据流入和流出数据库.