【发布时间】:2017-10-24 08:56:35
【问题描述】:
我有一个表 Blob,它有一个 varbinary(max) 作为列。现在我想使用 Filestream 将数据存储到数据库中。数据可能非常大(在我的情况下为 1.5GB),所以我不想将整个数据加载到缓冲区中。
我尝试了什么:
using (FileStream fs = File.Open(@"BigData.iso", FileMode.Open))
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = @"...";
conn.Open();
SqlCommand command = new SqlCommand("INSERT INTO Blob Values (@0, @1)", conn);
command.Parameters.Add(new SqlParameter("0", Guid.NewGuid()));
var sqlb = new SqlBytes(fs);
command.Parameters.Add(new SqlParameter("1", SqlDbType.VarBinary, -1)).Value = sqlb;
command.ExecuteNonQuery();
}
}
但我得到了一个 OutOfMemoryException,因为 SqlBytes 将其缓冲区初始化为整个数据大小。
我知道 Microsoft 提供了 FILESTREAM 功能,但我不想使用它。
有没有办法做到这一点?
【问题讨论】:
-
cmd.ExecuteNonQueryAsync(); ?并将流分配给参数。 docs.microsoft.com/en-us/dotnet/framework/data/adonet/…
-
"...数据可能非常大(在我的情况下为 1.5GB),所以我不想将 *整个数据** 加载到缓冲区中....我知道微软有一个
FILESTREAM功能,但是我不想使用它" - 为什么不呢?它非常适合您的需求 -
@LaurentLequenne 谢谢你的回答,我摆脱了 OutOfMemoryException,但如果我检查内存使用情况,我发现我保存了整个数据。
-
@MickyD 因为我在一家不需要 FILESTREAM 的公司工作。更好的是我不能使用它”。
标签: c# mysql sql-server stream