2017-06-05 12 views
-1

私はTBlobFieldからTADOBlobStreamを使ってデータを読み込もうとしていました。私は次の関数DelphiでADOを使用してTBlobFieldからデータを読み込むには?

function DecompressBlobFieldCustom(AField:TBlobField):String; 
    var 
     BLOBStream:TADOBlobStream; 
     Size:Integer; 
    begin 
     BLOBStream:= TADOBlobStream.Create(AField,bmRead); 
     Size:= BLOBStream.Size; 
     BLOBStream.Read(Result,Size); 
    end; 

を書き、

Data := DecompressBlobFieldCustom(FldImage); 

を次のように私は関数を使用するが、私はif Length(Data) > 0 thenをしようとするとき、私はAccess violation at address XXXXエラーを取得しています。私は問題を理解できませんでした。助けてください。

+0

ここで、(無料の) 'BLOBStream'オブジェクトを破棄しますか? 'Result'サイズはどこで設定しますか? –

答えて

1

Resultは文字列型ですが、ブロブストリームはバイト配列で動作します。通常、文字列であるかのようにバイト配列を扱うのは間違いです。さらに、エラーの実際の原因であるバッファを読み込みに割り当てることはありませんでした。 documentationで説明したように

function ReadBlobField(Field: TBlobField): TBytes; 
var 
    Stream: TStream; 
begin 
    Stream := TADOBlobStream.Create(Field, bmRead); 
    try 
    SetLength(Result, Stream.Size); 
    if Stream.Size>0 then 
     Stream.ReadBuffer(Result[0], Stream.Size); 
    finally 
    Stream.Free; 
    end; 
end; 

BLOBストリームを作成するTDataSetCreateBlobStream方法を用いることが好ましい。このようなバイト配列に

読みます。したがって、コードは次のようになります。

function ReadBlobField(DataSet: TDataSet; Field: TField): TBytes; 
var 
    Stream: TStream; 
begin 
    Stream := DataSet.CreateBlobStream(Field, bmRead); 
    try 
    SetLength(Result, Stream.Size); 
    if Stream.Size>0 then 
     Stream.ReadBuffer(Result[0], Stream.Size); 
    finally 
    Stream.Free; 
    end; 
end; 

データは実際にはバイト配列であり、テキストを保持していないと仮定しています。それがブロブに保持されているという事実は、減圧と画像の言及と同様に、それを示唆している。

いくつかの他のコメント:

  1. あなたがそれで終わっているときは、ストリームを破棄しなければなりません。
  2. 一般に、ではなく、ReadBufferを使用することをお勧めします。これは、要求されたバイト数が読み取られない場合には、ReadBufferが例外を発生させるためです。
+0

コンパイルエラーが発生しました。要素0にアクセスできない - Stream.Read(Result [0]、Stream.Size)行で 'Length'または 'SetLength'を使用します。 –

+0

こちらのコードはありません。壊れているコードではなく、私の答えにコードを使用してください。私の答えでコードの無作為に選ばれた部分を取ってあなたのコードに適用するだけではありません。プログラミングはそのようには機能しません。答えの中の関数を完全に使ってください。バイト配列が文字列ではないということに注意してください。 –

+0

My BlobField Conatins TextData。私は、以下の関数としてuCompressionユニットの関数を見つけました。DecompressBlobField(AField:TBlobField):String;過負荷; var SourceStream:TBlobStream; begin CheckAssigned(AField、NoBlobFieldMsg); SourceStream:= TBlobStream.Create(AField、bmRead); try 結果:= DecompressStream(SourceStream); 最終的に SourceStream.Free; end; end;その関数が文字列を返す方法は?実際には結果が文字列として欲しいです。 –

関連する問題