c# - 使用 Entity Framework 6 流式传输 varbinary(max) 数据

标签 c# .net sql-server entity-framework entity-framework-6

我有一个包含文件记录的 SQL Server 2012 表。每条记录都有一个 varbinary(max)BlobData 代表存储在文件中的数据——数据大小可以超过 1 GB,无法放入 RAM,所以我不不希望它由字节数组支持。我想实现两个流操作:

  • BlobData 行以 block 的形式顺序读取到缓冲区中;
  • 使用缓冲区连续覆盖 block 中的 BlobData 行。

使用普通 ADO.NET,实现此目的的一种直接方法是使用 SqlDataReaderUPDATE .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 指示的位置开始。

  1. 我的理解是 EntityDataReader.GetBytes() 类似于 SqlDataReader.GetBytes() 并且应该提供大致相似的性能 - 我是正确的还是在那里其他注意事项?

  2. 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/

相关文章:

c# - 已成功与服务器建立连接,但在登录前握手期间发生错误。 (提供商 : SSL Provider, 错误:0

c# - DataGridView 在添加行时抛出 "InvalidOperationException: Operation is not valid..."

.net - 根据键检索类值

sql - 交叉应用表值函数

c# - 如何调试 Visual Studio 2010 中的属性集?

c# - 使用 Free 3 of 9 字体生成条形码

c# - 在 .NET 中使用 DynamoDB 保留子类

c# - 通过 Parallel 类 API 中的 ParallelOptions 参数提供 TaskScheduler 选项的真正目的

sql-server - 在 Visual Studio Team Services 中以 Windows 用户身份运行

sql - 脚本 -> 查询多个数据库