2

Delphi 7FibPlusコンポーネントを使用しています。それらの 1 つですTpFIBQuery

ジェネリックを使用してテーブルからデータをロードしています

select * from TableName where Key = 1

返されたフィールドの 1 つはタイプBLOB(Text)です。

informatie次の3つの方法のいずれかを使用して、値を文字列リストに取得できないようです。

Informatie.Text := FieldByName('Informatie').AsString  // Returns the string 'BLOB'
Informatie.Text := BlobAsString('Informatie')          // Returns ''
BlobToStrings('Informatie',Informatie)                 // Returns ''

Database Workbench を使用して、テーブルのフィールドに保存されたテキストが実際に含まれていることを確認しました。

誰 ?

4

2 に答える 2

2

同じエラーを生成した@jiangの解決策を試した後、最終的に原因を見つけました。

それは私の部分によるエラーであることがわかりました(通常はそうです、あなたはそれを見つけなければなりません)。

元のクエリのフィールドの処理/読み取り中に、読み取りトランザクションを False に設定していたことが判明しました。

  • 別のテーブルでルックアップを実行して、クエリ内の整数値の説明を取得します。
  • このルックアップ クエリは、同じ read transactionを使用し、説明をルックアップした後にこのトランザクションを に設定しFalseます。
  • 元のクエリに戻った後、整数フィールドと文字列フィールドを読み取っても問題はありませんが (読み取りトランザクションは False に設定されています)、 ...AsString メソッドを使用して BLOB フィールドを文字列に読み取ると、エラーが発生するか、'BLOB' が返されます。 .

明らかに、読み取りアクションの開始時に読み取りトランザクションを True に設定し、すべての読み取りトランザクションの後に False に設定する必要があります。これは、Paradox BDE アプリケーションを Sqlserver アプリケーションの Firebird に変換する場合の主要な変更点です。


とにかく、解決策を見つけてよかったです。うまくいけば、他の人にも役立つでしょう。

于 2012-03-24T06:28:08.733 に答える
1

普段、私はこれが好きです

var 
   sl: TStrings; // blob IS NOT string!
   ms: TMemoryStream;
begin
   sl := TStringList.Create;
   ms := TMemoryStream.Create;
   try
     q.FieldByName('x').SaveToStream(ms);
     ms.Position := 0;
     sl.LoadFromStream(ms);
     // do what ever you want with sl here
     // and here too
   finally
     sl.Free;
     ms.Free;
   end; // try..finally
end;

q は TpFibQuery オブジェクトであることに注意してください。また、 select * from table は悪い習慣です。その習慣は、最終的には継続的な頭痛につながります。

于 2012-03-24T02:50:29.060 に答える