1

周囲のストリームインターフェイスを使用して、blobからバイナリデータを読み取りたいのですが。

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

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

つまり、ブロブが250MBのPhotoshopイメージであるかのように見せかけますサムネイルコードは、画像の最初の8バイトを読み取り、それがPSDファイルであることを認識し、3kサムネイルを含むオフセットを探し、それを読み取る方法を知っています。

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


リサーチ

方法:ADO.NETおよびVisual Basic .NETでチャンキングを使用してBLOB列との間でファイルを 読み書きします。これは、チャンクでの読み取りと書き込みが可能であることについて説明しています。しかし、コードが読めないので、私はそれを我慢できません。後で見ていきます。

また、この男は、データを書き込むための新しいSQL Server 2005 [ column .Write()] 3 T-SQL構文について言及しました-データを小さなチャンクに書き込むために使用できます(サーバーのすべてのメモリを消費しないようにするため)。たぶん[]があります。読み取り()疑似メソッド

Microsoftの記事:SQLServerにBLOB値を書き込む際のリソースの節約

4

3 に答える 3

2

新しいバージョンの 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
于 2009-08-11T21:11:46.420 に答える
1

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

于 2010-12-13T14:14:17.977 に答える
0

CommandBehaviorで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);
于 2009-01-29T19:34:35.733 に答える