【问题标题】:Streaming VARBINARY data from SQL Server in C#在 C# 中从 SQL Server 流式传输 VARBINARY 数据
【发布时间】:2011-02-18 14:38:50
【问题描述】:

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

提前致谢 - 如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 你试过直接使用SqlDataReader吗?

标签: c# sql stream varbinary


【解决方案1】:

请参阅 Download and Upload Images from SQL Server 以获取涵盖该主题的文章,包括高效的流语义。您必须使用以CommandBehavior.SequentialAccess 打开的SqlDataReader

SequentialAccess 提供了一种方法 处理行的 DataReader 包含具有大型二进制文件的列 价值观。而不是加载整个 行,SequentialAccess 启用 DataReader 将数据作为流加载。 然后您可以使用 GetBytes 或 GetChars 方法指定一个字节 开始读操作​​的位置, 和有限的数据缓冲区大小 被退回。

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

这篇后续文章解释了how to use a FILESTREAM column for efficient streaming of large VARBINARY data 进出数据库。

【讨论】:

  • 从您链接的文章中实现 SqlReaderStream 是否比直接使用 SqlDataReader.GetBytes 执行 byte[] 分块复制有很多好处?看起来在 .NET 4.5 中现在有一个 SqlDataReader.GetStream 方法。
  • @Michael:我文章中的流类主要是由于生命周期管理而需要的,因为创建流的时刻(控制器)不是使用流的时刻(响应),它们必须妥善处置资源。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-17
    • 2019-02-14
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多