在C#中从SQL Server流式传输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(); } 

在此先感谢 – 任何帮助表示赞赏。

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

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

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

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