关于这个问题的背景, 查看现在有一个大的 “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。
答案 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
/ UPDATETEXT
为image
或UPDATE.WRITE
附加BLOB为varbinary(max)
。 Here's an older example(使用image
,抱歉)。
同样,在读取数据时,您希望将数据在小缓冲区中泵送到其他目的地(http响应,网络,文件等)。东西like this(虽然我不太喜欢他处理他的EOF /分块;我会检查+ ve字节读取)。