gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:36 25 4
gpt4 key购买 nike

我在磁盘上有一个大文件,我需要将其内容作为 VARBINARY(MAX) 字段存储在 SqlServer 数据库中。 “内容”是指使用 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(我无论如何都不喜欢的类),而是创建一个 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);
}
}

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

关于c# - 将大文件流式传输到数据库 BLOB 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33263991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com