12

ASP.Netを使用して、データベースのVARBINARY(MAX)フィールドに格納されている画像データを提供しようとしています。現在、コードはデータテーブルを埋めてから、バイト配列をDataRowから引き出し、バイト配列を応答にプッシュしています。これらの巨大なバイト配列をマーシャリングすることなく、SQL Serverから応答にデータを多かれ少なかれストリーミングする方法があるかどうか疑問に思っています(画像が大きいため、OutOfMemoryExceptionsが発生します)。そのためのクラス/メカニズムはありますか?

現在のコードは多かれ少なかれ次のようになります。

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();
}

事前に感謝します-どんな助けでもありがたいです。

4

2 に答える 2

21

効率的なストリーミングセマンティクスを含むトピックをカバーする記事については、SQLServerからのイメージのダウンロードとアップロードを参照してください。SqlDataReaderで開いたものを使用する必要がありますCommandBehavior.SequentialAccess

SequentialAccessDataReader が大きなバイナリ値を持つ列を含む行を処理する方法を提供します。SequentialAccessを使用すると、行全体をロードするのではなく、DataReaderでデータをストリームとしてロードできます。次に、GetBytesまたはGetCharsメソッドを使用して、読み取り操作を開始するバイト位置と、返されるデータの制限されたバッファーサイズを指定できます。

リンクされた記事は、SqlDataReaderに基づくストリームを作成するための完全なコードを提供します。.Net4.0をまだ持っていない場合は、単純に、またはbyte[]チャンクコピーを使用できます。Stream.CopyTo(HttpResponse.OutputStream)

このフォローアップ記事では、FILESTREAM列を使用して、データベースに出入りする大きなVARBINARYデータを効率的にストリーミングする方法について説明します。

于 2011-02-18T17:46:02.480 に答える
0

上記の@Remusの回答は、.NET4.5がファーストクラスのSqlClientStreamingを導入したため、古くなっています。SQLクエリからストリームを取得するためにSqlDataReaderのGetBytes()メソッドにアクセスする必要がなくなりました。

ここで、SqlDataReader.GetStream(int)を呼び出すだけで、blob列を介してストリームを取得できます。

于 2019-07-17T14:35:37.070 に答える