如何使用FibPlus中的TpFIBQuery组件读取BLOB(文本)字段

时间:2012-03-23 17:50:09

标签: delphi blobs fibplus

我正在使用 Delphi 7 FibPlus 组件。其中一个是TpFIBQuery

我正在使用通用

从表中加载数据
select * from TableName where Key = 1

返回的其中一个字段属于BLOB(Text)

我似乎无法使用以下3种方式之一将值放入字符串列表informatie中:

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

我已确认使用Database Workbench表中的字段确实包含已保存的文本。

任何人?

2 个答案:

答案 0 :(得分:2)

在尝试出现同样错误的@jiang解决方案之后,我终于找到了罪魁祸首。

原来这是一个错误,因为我的部分(通常是,你只需要找到它)。

原来我在处理/读取原始查询的字段期间将读取事务设置为False

  • 我在另一个表中执行查找以获取查询中整数值的描述。
  • 此查询查询使用相同的读取事务,并在查找说明后将此事务设置为False
  • 在返回原始查询后,读取整数和字符串字段没有问题(虽然读取事务已设置为False ),但是将BLOB字段读取到带有...的字符串中AsString方法产生错误或返回'BLOB'。

显然,我需要在读取操作开始时将读取事务设置为True,并在所有读取事务之后将其设置为False。当您将Paradox BDE应用程序转换为Firebird of Sqlserver应用程序时,这是一个重大更改。


无论如何,我很高兴我找到了解决方案。希望它也会帮助其他人。

答案 1 :(得分:1)

usualy,我喜欢这个

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是糟糕的不良做法。 这种习惯最终会让你持续头痛。