Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Использование TIBQuery для получения автоинкрементного ключа в Firebird с Delphi: инструкция

Delphi , Базы данных , Interbase

Использование TIBQuery для получения автоинкрементного ключа в Firebird с Delphi

Вопрос, который стоит перед разработчиками, работающими с базой данных Firebird и использующими компоненты IBX в Delphi, заключается в возможности получения автоинкрементного ключа при вставке новой записи. В Firebird для этого используется конструкция INSERT ... RETURNING, которая позволяет возвращать значение определенного поля после вставки данных.

Проблема

Разработчик столкнулся с проблемой при попытке выполнить операцию вставки данных в таблицу и получения автоинкрементного ключа с использованием компонента TIBQuery. При выполнении кода возникла ошибка Dynamic SQL error sql error code = -104.

Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO XXXX (vodate,description) values ('"+ VDate +"','"+ Description +"') returning vno INTO :ParamVoucherNo");

Query1->Params->ParamByName("ParamVoucherno")->ParamType = ptResult;
Query1->Params->ParamByName("ParamVoucherno")->DataType = ftInteger;
Query1->Params->ParamByName("ParamVoucherno")->Value = "";
Query1->Prepare();
Query1->ExecSQL();

Решение

Согласно документации Firebird, конструкция INSERT ... RETURNING в DSQL не поддерживается, и предназначена только для PSQL. Поскольку IBX использует DSQL, необходимо исключить часть INTO из запроса.

Для получения автоинкрементного ключа следует использовать метод Open вместо ExecSQL, так как INSERT ... RETURNING в DSQL аналогичен вызову хранимой процедуры, возвращающей результаты.

Альтернативные подходы

  1. Получение следующего значения автоинкрементного ключа перед вставкой записи.
  2. Использование внешней компоненты, такой как FIBPLUS, которая поддерживает функции Firebird.
  3. Использование EXECUTE BLOCK для обертки INSERT и получения возвращаемого значения.
  4. Переход на использование FireDAC, который поддерживает необходимые функции для работы с Firebird.

Пример кода

Пример использования EXECUTE BLOCK для возврата автоинкрементного ключа:

Query1->SQL->Clear();
Query1->SQL->Add("EXECUTE BLOCK RETURNS (DeptKey INT) AS BEGIN INSERT INTO DEPARTMENT (COMPANY_KEY, DEPARTMENT_NAME) VALUES (1, 'TEST1') RETURNING DEPARTMENT_KEY INTO :DeptKey; SUSPEND; END");

Query1->Open();
ANewKey := Query1->Fields[0]->AsInteger;

Заключение

Для получения автоинкрементного ключа после вставки данных в Firebird с использованием Delphi и компонентов IBX, необходимо использовать конструкции, поддерживаемые DSQL или перейти на использование компонентов, специально разработанных для работы с Firebird, например, FireDAC.

Создано по материалам из источника по ссылке.

Разработчик в Delphi столкнулся с проблемой получения автоинкрементного ключа после вставки записи в Firebird с использованием компонента `TIBQuery`.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Interbase ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 12:16:16/0.0013611316680908/0