我有一个包含文件记录的 SQL Server 2012 表。每条记录都有一个 varbinary(max)
列 BlobData
代表存储在文件中的数据——数据大小可以超过 1 GB,无法放入 RAM,所以我不不希望它由字节数组支持。我想实现两个流操作:
- 将
BlobData
行以 block 的形式顺序读取到缓冲区中; - 使用缓冲区连续覆盖 block 中的
BlobData
行。
使用普通 ADO.NET,实现此目的的一种直接方法是使用 SqlDataReader
和 UPDATE .WRITE()
:
// 1. Sequentially read varbinary(max) into a buffer
using (SqlDataReader reader = sqlCommand.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))
{
while (reader.Read())
{
byte[] buffer = new byte[size];
while ((count = reader.GetBytes(0, offset, buffer, 0, buffer.Length)) > 0)
{
DoStuffWithBuffer(buffer);
offset += count;
}
}
}
// 2. Sequentially overwrite varbinary(max) from a buffer - iterate:
UPDATE [File] SET [BlobData].WRITE(@buffer, @offset, @count)
WHERE [FileID]=@id
据我所知,此类操作过去不在 EF 的范围内,我最好的选择是简单地坚持使用 ADO.NET。但是,我注意到 EF6 有一些新方法,例如 EntityDataReader.GetBytes()
,引用 MSDN , » 从指定列读取字节流,从 dataIndex 指示的位置开始,到缓冲区,从 bufferIndex 指示的位置开始。
我的理解是
EntityDataReader.GetBytes()
类似于SqlDataReader.GetBytes()
并且应该提供大致相似的性能 - 我是正确的还是在那里其他注意事项?EF6 中是否有一种方法可以在
varbinary(max)
列上执行类似于UPDATE .WRITE(buffer, offset, count)
的操作?
我的解决方案的其他部分使用 EF6,因此为了保持一致性,我理想情况下也希望使用 EF6 实现所有这些。
鉴于新的 EF6 功能,我可以/应该使用 EF6 实现此功能,还是应该像过去建议的那样坚持使用 ADO.NET?我正在使用 .NET 4.0。
最佳答案
可能有点晚了 - 但 context.Database.ExecuteSqlCommand 接受流作为参数,即
var id = 1234;
var blobStream = await someSource.ReadAsStreamAsync(); // obtain some stream
db.Database.ExecuteSqlCommand($"UPDATE MyTable set BlobColumn=@p0
where Id=@p1", blobStream, id);
关于c# - 使用 Entity Framework 6 流式传输 varbinary(max) 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26164192/