如何从/到SQL Server BLOB字段流数据?

时间:2010-01-20 12:39:39

标签: .net sql-server ado.net

  

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

我希望能够使用Stream对象向/从SQL Server行中的BLOB字段读取/写入数据,而无需将 all 数据放入临时缓冲区。


如果可以做到以上......

由于Streams类有很多CanXXX()方法,所有方法都不能使用所有流来接受流输入/输出。

那么在向/从SQL Server发送数据时,流必须能够与ADO.NET一起工作吗?


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

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

2 个答案:

答案 0 :(得分:5)

以下是以块的形式读取数据的示例:

    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;
                }
            }

        }
    }

答案 1 :(得分:1)

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

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