将大文件流式传输到数据库BLOB字段

时间:2015-10-21 15:59:31

标签: c# sql-server stream

我在磁盘上有一个大文件,其内容我需要作为VARBINARY(MAX)字段存储在SqlServer数据库中。 “内容”,我的意思是使用像File.ReadAllBytes()这样的东西。 (我理解这个的缺陷,但它是目前的操作模式,所以我现在必须处理它。)

我找到了这个答案,它提供了一种使用Byte[]来传输大型UPDATE.WRITE的方法:

How to I serialize a large graph of .NET object into a SQL Server BLOB without creating a large buffer?

但是,只需将大文件的内容读入内存中的Byte[]就会导致此问题:

OutOfMemoryException when I read 500MB FileStream

我可能会忽略一些显而易见的事情,但我无法弄清楚我应该如何从磁盘上的大文件到最终存储到数据库中。

1 个答案:

答案 0 :(得分:0)

使用我从这两页得到的一些提示,我有一个有效的答案:

http://www.syntaxwarriors.com/2013/stream-varbinary-data-to-and-from-mssql-using-csharp/(这看起来很像序列化SO答案,但这里有更多......不确定是谁复制了谁!)。

How do I copy the contents of one stream to another?

基本上,它使用与序列化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);
    }
}

所以诀窍就是链接两个流,将数据从一个流复制到另一个流,如评论中所述。