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

Я использую 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 ]

2 голосов
/ 24 марта 2012

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

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

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

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

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


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

1 голос
/ 24 марта 2012

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

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

...