c# – 使用Entity Framework 6的流式varbinary(max)数据
我有一个包含文件记录的SQL Server 2012表.每条记录都有一个varbinary(max)列BlobData,表示存储在文件中的数据 – 数据大小可能超过1 GB,不能容纳在RAM中,因此我不希望它由字节数组支持.我想实现两个流操作:
>将块中的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,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,因此为了保持一致性,我最好也希望使用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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 客制FORM调用会计科目弹性域/根据科目取得CODE_COMBINATION
- xml – 如何将广播组添加到表格内的单选按钮?
- swift – 有没有办法获得变量列表和类的功能
- UIKit框架-高级控件Swift版本: 10.UIWebView方法/属性详解
- 使用 watchify 加速 browserify 编译
- 图片加水印和生成缩略图C#代码
- flex 和 .net通过fluorineFX remoteobject通信详解:
- swift – 当superView的比例改变时,绘制路径的CABasicAnima
- c# – 最简洁的方法来确定一个变量是否等于值列表中的一个值
- PostgreSql的Explain命令详解