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