我在磁盘上有一个大文件,我需要将其内容存储在SqlServer数据库中作为VARBINARY(MAX)
字段。所谓"内容",我指的是使用File.ReadAllBytes()
之类的东西。(我理解这样做的缺陷,但这是当前的操作模式,所以我现在必须处理它。)
我找到了这个答案,它提供了一种通过使用UPDATE.WRITE
来流式传输大型Byte[]
的方法:
我如何序列化一个大图的。net对象到一个SQL Server BLOB没有创建一个大的缓冲区?
然而,简单地将大文件的内容读入内存中的Byte[]
会导致这个问题:
OutOfMemoryException when I read 500MB FileStream
我可能忽略了一些明显的东西,但我就是不知道应该如何从磁盘上的大文件到数据库的最终存储
使用我从这两页得到的一些提示,我有一个有效的答案:
http://www.syntaxwarriors.com/2013/stream-varbinary-data-to-and-from-mssql-using-csharp/(这看起来很像序列化SO的答案,但这里有更多…不知道谁复制了谁!)。
如何将一个流的内容复制到另一个流?
基本上,它使用了与关于序列化blob的答案相同的方法,但不是使用BinaryFormatter
(无论如何我都不喜欢的类),它创建了一个FileStream
,它接受文件的路径,以及一个扩展方法将该流复制到目标流,或BlobStream
,如示例所示。
扩展名:
public static class StreamEx
{
public static void CopyTo(this Stream Input, Stream Output)
{
var buffer = new Byte[32768];
Int32 bytesRead;
while ((bytesRead = Input.Read(buffer, 0, buffer.Length)) > 0)
Output.Write(buffer, 0, bytesRead);
}
}
所以技巧是链接两个流,以块的方式将数据从一个复制到另一个,正如评论中所指出的。