2011-02-18 66 views
11

我想使用ASP.Net服務存儲在數據庫的VARBINARY(MAX)字段中的圖像數據。現在,代碼正在填充數據表,然後將字節數組從DataRow中拖出並將字節數組推入響應中。我想知道是否有辦法或多或少地將SQL Server中的數據流式傳輸到響應中,而無需對這些龐大的字節數組進行編組(因爲映像很大,它們會導致OutOfMemoryException異常)。有沒有類/機制?從C#中的SQL Server流VARBINARY數據來自#

當前的代碼看起來多少有點像:

DataTable table = new DataTable(); 
SqlDataAdapter adapter = new SqlDataAdapter(commandText, connectionString); 
adapter.Fill(table); 
DataRow row = table.Rows[0]; 
byte[] imageData = row[0] as byte[]; 
if(imageData != null) 
{ 
    Response.Clear(); 
    Response.BinaryWrite(imageData); 
    Response.End(); 
} 

在此先感謝 - 任何幫助表示讚賞。

+0

您是否嘗試過直接使用SqlDataReader? – 2011-02-18 15:08:46

回答

18

查看Download and Upload Images from SQL Server瞭解有關主題的文章,包括高效的流式語義。您必須使用開通了SqlDataReaderCommandBehavior.SequentialAccess

SequentialAccess提供用於 一種方式的DataReader來處理 包含有大型二進制 值的列行。 SequentialAccess不是加載整個 行,而是使數據讀取器能夠將數據加載爲流。 然後,您可以使用GetBytes或 GetChars方法來指定開始讀取操作的位置 位置,並且返回數據 的有限緩衝區大小。

鏈接的文章提供了完整的代碼創建由SqlDataReader的支持的流,你可以簡單地Stream.CopyTo(HttpResponse.OutputStream),或使用一個byte []分塊副本,如果你沒有.NET 4.0呢。

此後續文章解釋了how to use a FILESTREAM column for efficient streaming of large VARBINARY data進出數據庫。

+0

是的,這就是我要找的 - 謝謝@remus – mhildreth 2011-03-02 19:27:34

相關問題