【问题标题】:How to Stream data from/to SQL Server BLOB fields?如何从/向 SQL Server BLOB 字段流式传输数据?
【发布时间】:2011-01-07 06:21:12
【问题描述】:

关于这个问题的背景, “How to I serialize a large graph of .NET object into a SQL Server BLOB without creating a large buffer?” 现在有一个大 赏金。

我希望能够使用Stream 对象从 SQL Server 行中的 BLOB 字段读取/写入数据,而不必将 所有 数据放入临时缓冲区.


如果能做到以上...

由于 Streams 类有很多 CanXXX() 方法,并非所有流都可以被所有方法使用,接受流输入/输出。

那么在向/从 SQL Server 发送数据时,流与ADO.NET 一起工作的能力有多大?


我希望有一个标准 Stream,我可以将它传递给其他 API。

到目前为止,这两个答案仅涉及从 SqlServer 获取数据,而不是将数据发送到 SqlServer。

【问题讨论】:

  • 几天前我在搜索同样的东西时遇到了这个问题。在这里找到完整的工作解决方案:syntaxwarriors.com/2013/…

标签: .net sql-server ado.net


【解决方案1】:

下面是分块读取数据的示例:

    using (var conn = new SqlConnection(connectionString))
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = "select somebinary from mytable where id = 1";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                byte[] buffer = new byte[1024]; // Read chunks of 1KB
                long bytesRead = 0;
                long dataIndex = 0;
                while ((bytesRead = reader.GetBytes(0, dataIndex, buffer, 0, buffer.Length)) > 0)
                {
                    byte[] actual = new byte[bytesRead];
                    Array.Copy(buffer, 0, actual, 0, bytesRead);
                    // TODO: Do something here with the actual variable, 
                    // for example write it to a stream
                    dataIndex += bytesRead;
                }
            }

        }
    }

【讨论】:

  • 我希望有一个标准的流,我可以将它传递给其他 API。
  • 实际上,它被记录为在 8040 字节的块中工作是理想的。我也不确定你想通过每次迭代复制缓冲区来做什么。
  • 我将缓冲区复制到 actual 变量,具体取决于读取的实际字节数,因为它包含的字节数可能少于其大小。
【解决方案2】:

您不会将所有数据放入缓冲区;您通常会运行一个循环,缓冲 8040 字节的倍数(与页面大小相关),每次都附加 BLOB WRITETEXT / UPDATETEXTimage,或UPDATE.WRITEvarbinary(max)Here's an older example(使用 image,抱歉)。

同样,在读取数据时,您希望将小缓冲区中的数据泵送到其他目的地(http 响应、网络、文件等)。 like this 的东西(虽然我不太喜欢他如何处理他的 EOF / 分块;我会检查 +ve bytes read)。

【讨论】:

  • 示例从 FileStream 读取数据然后将其读取到 SqlServer,我有一个 Stream 我可以传递给写入 Stream 的其他 API 并将数据放在 SqlServer 上
  • @Ian - 在这种情况下,您是否调查过SqlFileStream 和 SQL Server 2008?或许见aghausman.net/dotnet/…
  • 我认为我们不能让所有客户都更新到 Sql Server 2008,否则 SqlFileStream 对我们来说会很好用。
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2019-02-14
  • 2019-06-28
  • 1970-01-01
  • 2018-12-05
相关资源
最近更新 更多