12

我正在尝试使用 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();
}

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

4

2 回答 2

21

请参阅从 SQL Server 下载和上传图像以获取涵盖该主题的文章,包括高效的流语义。您必须使用SqlDataReader打开的 with CommandBehavior.SequentialAccess

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

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

这篇后续文章解释了如何使用 FILESTREAM 列来高效地将大型 VARBINARY 数据流式传输到数据库中和从数据库中流出。

于 2011-02-18T17:46:02.480 回答
0

自从 .NET 4.5 引入了一流的SqlClient Streaming以来,@Remus 上面的答案已经过时了。不再需要访问 SqlDataReader 的 GetBytes() 方法来从 SQL 查询中获取流。

现在您只需调用SqlDataReader.GetStream(int)即可通过 blob 列获取流。

于 2019-07-17T14:35:37.070 回答