2014-10-02 30 views
4

我有一個包含文件記錄的SQL Server 2012表。每個記錄都有一個varbinary(max)BlobData,表示存儲在文件中的數據 - 數據大小可能超過1 GB,並且不能放入RAM,因此我不希望它支持字節數組。我想實現兩個流式操作:使用實體框架流式傳輸varbinary(max)數據6

  • 順序讀取BlobData行塊成緩衝區;
  • 使用緩衝區以塊爲單位順序覆蓋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][email protected] 

據我所知,這樣的操作並非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。

+1

你有沒有得到解決這個? – camainc 2015-11-25 20:15:46

+1

@camainc不幸的是我沒有 - 我不知道如果在這一點上這是可以通過EF做的。 – w128 2015-11-25 20:33:17

回答

0

有點晚了,也許 - 但context.Database.ExecuteSqlCommand接受流作爲參數,即

var id = 1234; 
var blobStream = await someSource.ReadAsStreamAsync(); // obtain some stream 
db.Database.ExecuteSqlCommand($"UPDATE MyTable set [email protected] 
           where [email protected]", blobStream, id);