Вопрос пользователя заключается в том, что он нашел код, который работает в FlameRobin для подсчета количества записей во всех таблицах базы данных, но смог выполнить его только в контексте TFDScript. Хотя скрипт выполняется без ошибок, доступ к результатам запроса недоступен. Попытки использования TFDQuery и TFDCommand, а также проверка TFDConnection приводят к ошибке парсинга, так как эти компоненты не предназначены для работы со скриптами.
После долгих поисков пользователь не смог найти способ доступа к результатам из TFDScript, несмотря на наличие свойства FetchOptions, указывающего на возможность такой операции.
Подтвержденный ответ
Пользователь столкнулся с трудностями при попытке получить результат выполнения скрипта в TFDScript. Однако, для получения результатов запросов к базе данных Firebird рекомендуется использовать TFDQuery в сочетании с TFDConnection.
Разместите TFDConnection и TFDQuery на форме нового проекта VCL.
Добавьте на форму TDataSource и TDBGrid, связав TDataSource с TFDQuery и TDBGrid с TDataSource.
Установите свойство Sql.TextTFDQuery в значение, соответствующее коду скрипта, не включая команду SET TERM ....
Установите свойство ActiveTFDQuery в True, чтобы выполнить запрос и отобразить результаты в TDBGrid.
Альтернативный способ
Если предыдущий способ не работает, можно использовать следующий код для генерации SQL-запроса, который затем выполнить с помощью TFDQuery:
procedure TForm2.btnGenSqlClick(Sender: TObject);
var
Sql : String;
TableName : String;
const
sGetTableNames = 'SELECT RDB$RELATION_NAME FROM RDB$RELATIONS R WHERE R.RDB$SYSTEM_FLAG IS NULL OR R.RDB$SYSTEM_FLAG = 0 AND R.RDB$VIEW_BLR IS NULL';
begin
FDQuery1.Open(sGetTableNames);
Sql := '';
while not FDQuery1.Eof do
begin
TableName := FDQuery1.Fields[0].AsString;
if Sql <> '' then
Sql := Sql + #10' UNION ' + #10;
Sql := Sql + Format('SELECT ''%s'', COUNT(*) FROM %s', [TableName]);
FDQuery1.Next;
end;
FDQuery1.Open(Sql);
end;
В этом коде используется конструкция Format для подстановки названий таблиц в результирующий SQL-запрос.
Обновление
Пользователь столкнулся с ошибкой 'multiple rows in singleton select', но после внесения изменений, предложенных в ответе (удаление команды SET TERM ...), проблема была решена. Ошибка в исходном коде пользователя заключалась в том, что он пытался выполнить метод Execute вместо Open, что и вызывало ошибку. Пользователь извинился за недоразумение и поблагодарил за помощь.
Заключение
Важно внимательно проверять код и правильно использовать методы компонентов TFDQuery и TFDConnection для работы с базами данных Firebird в Delphi. При необходимости можно воспользоваться дополнительными способами генерации SQL-запросов, как показано в альтернативном ответе.
Пользователь сталкивается с проблемой доступа к результатам запроса в контексте использования скриптов `TFDScript` в Delphi при работе с базой данных Firebird.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.