将大文件流式传输到数据库 BLOB 字段
Streaming a large file into a database BLOB field
我在磁盘上有一个大文件,我需要将其内容作为 VARBINARY(MAX)
字段存储在 SqlServer 数据库中。 "contents",我的意思是使用类似 File.ReadAllBytes()
的东西。 (我理解其中的隐患,但这是当前的操作模式,所以我暂时不得不处理它。)
我找到了这个答案,它提供了一种通过使用 UPDATE.WRITE
:
流式传输大型 Byte[]
的方法
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
我可能忽略了一些明显的东西,但我不知道应该如何从磁盘上的大文件中获取结果存储到数据库中。
根据我从这两页获得的一些提示,我得到了一个有效的答案:
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
(我无论如何都不喜欢 class),而是创建一个 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);
}
}
所以诀窍是 link 两个流,以分块的方式将数据从一个流复制到另一个流,如评论中所述。
我在磁盘上有一个大文件,我需要将其内容作为 VARBINARY(MAX)
字段存储在 SqlServer 数据库中。 "contents",我的意思是使用类似 File.ReadAllBytes()
的东西。 (我理解其中的隐患,但这是当前的操作模式,所以我暂时不得不处理它。)
我找到了这个答案,它提供了一种通过使用 UPDATE.WRITE
:
Byte[]
的方法
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
我可能忽略了一些明显的东西,但我不知道应该如何从磁盘上的大文件中获取结果存储到数据库中。
根据我从这两页获得的一些提示,我得到了一个有效的答案:
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
(我无论如何都不喜欢 class),而是创建一个 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);
}
}
所以诀窍是 link 两个流,以分块的方式将数据从一个流复制到另一个流,如评论中所述。