Как прочитать BLOB-поле (текст) с помощью компонентов TpFIBQuery из FibPlus

Я использую Delphi 7 с компонентами FibPlus. Одним из них является TpFIBQuery,

Я загружаю данные из таблицы с общим

select * from TableName where Key = 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 я подтвердил, что поле в таблице действительно содержит сохраненный текст.

Кто-нибудь?

2 ответа

После попытки решения проблемы @jiang, которая вызвала ту же ошибку, я наконец нашел виновника.

Оказывается, это была ошибка из-за моей части (обычно это так, просто нужно ее найти).

Оказывается, я когда-то установил транзакцию чтения в False во время обработки / чтения полей исходного запроса.

  • Я выполняю поиск в другой таблице, чтобы получить описание целочисленного значения в запросе.
  • Этот поисковый запрос использует ту же транзакцию чтения и устанавливает для этой транзакции значение False после просмотра описания.
  • После возвращения к исходному запросу чтение целочисленных и строковых полей не представляет проблем (хотя для транзакции чтения установлено значение False), но чтение поля BLOB в строку с помощью метода...AsString приводит к ошибке или возвращает BLOB,

Очевидно, мне нужно установить транзакцию чтения на True в начале действий чтения и установить значение False после ВСЕХ транзакций чтения. Это основное изменение, когда вы конвертируете приложение Paradox BDE в приложение Firebird of Sqlserver.


В любом случае, я рад, что нашел решение. Надеюсь, это поможет и другим.

Обычно, мне так нравится

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. также выбор * из таблицы - плохая практика. эта привычка в конечном итоге приведет вас к постоянной головной боли.

Другие вопросы по тегам