我有一個包含文件記錄的SQL Server 2012表。每個記錄都有一個varbinary(max)
列BlobData
,表示存儲在文件中的數據 - 數據大小可能超過1 GB,並且不能放入RAM,因此我不希望它支持字節數組。我想實現兩個流式操作:使用實體框架流式傳輸varbinary(max)數據6
- 順序讀取
BlobData
行塊成緩衝區; - 使用緩衝區以塊爲單位順序覆蓋
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][email protected]
據我所知,這樣的操作並非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。
你有沒有得到解決這個? – camainc 2015-11-25 20:15:46
@camainc不幸的是我沒有 - 我不知道如果在這一點上這是可以通過EF做的。 – w128 2015-11-25 20:33:17