質問

Stream インターフェイスを使用して、BLOB からバイナリ データを読み取りたいと考えています。

ただし、BLOB を完全にクライアント側でロードしてメモリまたはファイルに保存する必要はありません。

BLOB を使用するコードでシークと読み取りができるようにし、シークと読み取りをサポートするために必要な量のデータのみがネットワーク経由で送信されるようにしたいと考えています。

つまり 演じる BLOB は 250MB の Photoshop イメージです。サムネラー コードは、画像の最初の 8 バイトを読み取り、それが PSD ファイルであることを認識し、3k サムネールを含むオフセットをシークして、それを読み取る方法を知っています。

したがって、250MB のメモリを割り当てたり、一時ファイルを作成したり、250MB がネットワーク経由で転送されるのを待つ必要はなくなります。仮想の SQLServerBlobStreamServerCursor クラスは、実際に要求されたものにデータ トラフィックを送信する方法を知っています。


研究

方法:ADO.NET および Visual Basic .NET でチャンクを使用した BLOB 列へのファイルの読み取りと BLOB 列へのファイルの書き込みこれは、塊で読み書きできることについて話しています。でもコードが切れて読めなくなるのは我慢できません。後で見てみます。

また この男 新しい SQL Server 2005 について言及しました [カラム.Write()]3 データを書き込むための T-SQL 構文 - データを小さな塊に書き込むために使用できる (サーバーのメモリをすべて消費しないようにするため)。もしかしたら[があるかも知れませんカラム].読む() 疑似メソッド

Microsoft には次の記事があります。 BLOB 値を SQL Server に書き込む際のリソースの節約

役に立ちましたか?

解決

新しいバージョンの SQL Server では、テキストだけでなくバイナリ データ型に対しても SUBSTRING() 関数を使用してプレーン SQL を使用できます。見る http://msdn.microsoft.com/en-us/library/ms187748.aspx

画像のサイズを取得するには:

select datalength(blobcolumn) from myimages where imgid = 12345;

最初の 8 バイトを読み取るには:

select substring(blobcolumn, 1, 8) from myimages where imgid = 12345;

877 バイトを読み取るには、オフセット 115000 ~ 115876:

select substring(blobcolumn, 115001, 877) from myimages where imgid = 12345;

部分文字列関数は 0 ではなく 1 オフセットに基づいていることに注意してください。

読み取り部分の間で列が変更される可能性があることを考慮する場合は、トランザクション内にさまざまな選択をすべて入れることができます。

これは私はテストしていませんが、古いバージョンの MS SQL Server では、(現在は非推奨になっている) READTEXT 動詞と TEXTPTR() 関数を使用する必要があるようです。のような:

select textptr(blobcolumn) from myimages where imgid = 12345;

返されたポインター値 (PTR など) を取得し、それを後続のクエリで使用します。

readtext blobcolumn @PTR 115001 887

他のヒント

これには、新しい SQL Server 2008 FileStream 機能の使用を検討できます。 http://msdn.microsoft.com/en-us/library/cc645940.aspx

ADO.NET を使用するとよいでしょう。 SqlDataReader オブジェクトを使用して SequentialAccess コマンドの動作。これにより、バッファ サイズを定義し、データをチャンクで読み取ることができます。

この記事を参照してください。 http://msdn.microsoft.com/en-us/library/87z0hy49(VS.71).aspx

byte[] outbyte;
int bufferSize = 8;
SqlDataReader myReader = myCmd.ExecuteReader(CommandBehavior.SequentialAccess);
...
long returnBytes = myReader.GetBytes(1, 0, outbyte, 0, bufferSize);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top