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

Получение автоинкрементного ID при вставке данных в SQLite с использованием Delphi

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

 

В процессе работы с SQLite и Delphi, часто возникает необходимость получить автоинкрементный ID после вставки данных. В этой статье мы рассмотрим несколько способов, как это можно сделать, а также обсудим возможные проблемы и их решения.

Проблема

Пользователь Paul Dardeau столкнулся с тем, что после выполнения вставки данных в таблицу SQLite, он не мог получить значение автоинкрементного поля database_id. Давайте разберем его код и предложим несколько решений.

Исходный код пользователя

Sql := 'INSERT INTO databases ' +
       '(database_name,' +
        'db_file_name,' +
        'db_file_path,' +
        'db_description,' +
        'created_at) ' +
      'VALUES (:database_name,' +
              ':db_file_name,' +
              ':db_file_path,' +
              ':db_description,' +
              ':created_at) ' +
      'RETURNING database_id';
SqlQuery.SQL.Text := Sql;
SqlQuery.ParamByName('database_name').AsString := ADatabase.Name;
SqlQuery.ParamByName('db_file_name').AsString := ADatabase.FileName;
SqlQuery.ParamByName('db_file_path').AsString := ADatabase.FilePath;
SqlQuery.ParamByName('db_description').AsString := ADatabase.Description;
SqlQuery.ParamByName('created_at').AsString := GetCurrentTimeStamp;
ExecuteQuery(SqlQuery, false);   // функция обёртка, которая выполняет SqlQuery.ExecSQL
DatabaseId := SqlQuery.Fields[5].AsInteger;  // <-- это не работает. Как получить значение RETURNING?

Решение 1: Использование RETURNING и параметров вывода

Согласно ответу Remy Lebeau, для получения значений, возвращаемых вставкой, можно использовать параметры вывода. Это особенно полезно, если вы используете RETURNING в вашем SQL-запросе.

Пример кода:

Sql := 'INSERT INTO databases ' +
       '(database_name,' +
        'db_file_name,' +
        'db_file_path,' +
        'db_description,' +
        'created_at) ' +
      'VALUES (:database_name,' +
              ':db_file_name,' +
              ':db_file_path,' +
              ':db_description,' +
              ':created_at) ' +
      'RETURNING database_id';
SqlQuery.SQL.Text := Sql;
SqlQuery.ParamByName('database_name').AsString := ADatabase.Name;
SqlQuery.ParamByName('db_file_name').AsString := ADatabase.FileName;
SqlQuery.ParamByName('db_file_path').AsString := ADatabase.FilePath;
SqlQuery.ParamByName('db_description').AsString := ADatabase.Description;
SqlQuery.ParamByName('created_at').AsString := GetCurrentTimeStamp;

// Добавляем параметр вывода
with TParam(SqlQuery.Params.Add) do begin
  Name := 'RET_database_id';
  DataType := ftInteger;
  ParamType := ptOutput;
end;

ExecuteQuery(SqlQuery, false);
DatabaseId := SqlQuery.ParamByName('RET_database_id').AsInteger;

Решение 2: Использование AUTOINCREMENT и LAST_INSERT_ID()

Другой подход заключается в использовании AUTOINCREMENT для столбца database_id и функции LAST_INSERT_ID() для получения последнего вставленного значения.

Пример кода:

// Создание таблицы с AUTOINCREMENT
CREATE TABLE databases (
   database_id INTEGER PRIMARY KEY AUTOINCREMENT,
   database_name TEXT UNIQUE NOT NULL,
   db_file_name TEXT NOT NULL,
   db_file_path TEXT NOT NULL,
   db_description TEXT NOT NULL,
   created_at TEXT NOT NULL,
   last_update TEXT NULL
) STRICT;

// Вставка данных
Sql := 'INSERT INTO databases ' +
       '(database_name,' +
        'db_file_name,' +
        'db_file_path,' +
        'db_description,' +
        'created_at) ' +
      'VALUES (:database_name,' +
              ':db_file_name,' +
              ':db_file_path,' +
              ':db_description,' +
              ':created_at)';
SqlQuery.SQL.Text := Sql;
SqlQuery.ParamByName('database_name').AsString := ADatabase.Name;
SqlQuery.ParamByName('db_file_name').AsString := ADatabase.FileName;
SqlQuery.ParamByName('db_file_path').AsString := ADatabase.FilePath;
SqlQuery.ParamByName('db_description').AsString := ADatabase.Description;
SqlQuery.ParamByName('created_at').AsString := GetCurrentTimeStamp;

ExecuteQuery(SqlQuery, false);

// Получение последнего вставленного ID
Sql := 'SELECT LAST_INSERT_ID()';
SqlQuery.SQL.Text := Sql;
ExecuteQuery(SqlQuery, false);
DatabaseId := SqlQuery.Fields[0].AsInteger;

Решение 3: Использование FireDAC

Если вы используете FireDAC, можно воспользоваться методом FDConnection1.execSQLScalar, который позволяет получить скалярное значение из запроса.

Пример кода:

DatabaseId := FDConnection1.ExecSQLScalar(
  'INSERT INTO databases ' +
  '(database_name, db_file_name, db_file_path, db_description, created_at) ' +
  'VALUES (:database_name, :db_file_name, :db_file_path, :db_description, :created_at) ' +
  'RETURNING database_id',
  [ADatabase.Name, ADatabase.FileName, ADatabase.FilePath, ADatabase.Description, GetCurrentTimeStamp]
);

Заключение

В данной статье мы рассмотрели несколько способов получения автоинкрементного ID после вставки данных в SQLite с использованием Delphi. Каждый из предложенных методов имеет свои плюсы и минусы, и выбор подходящего зависит от конкретной ситуации и требований вашего проекта.

Если вы столкнулись с проблемами, связанными с дублированием записей, как у Paul Dardeau, рекомендуется проверить используемый драйвер и, возможно, перейти на более надежный, такой как FireDAC. Также не забывайте следить за обновлениями и исправлениями от Embarcadero и других разработчиков.

Надеюсь, эта статья поможет вам решить подобные задачи и улучшить работу с SQLite в проектах на Delphi.

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

Контекст описывает несколько способов получения автоинкрементного ID после вставки данных в SQLite с использованием Delphi, включая использование параметров вывода, функции LAST_INSERT_ID() и метода FDConnection1.execSQLScalar, а также обсуждает проблемы


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

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




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


:: Главная :: SQL ::


реклама


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

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