SQldb autoincrement

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
story
незнакомец
Сообщения: 8
Зарегистрирован: 24.01.2011 08:26:37

SQldb autoincrement

Сообщение story »

База данных sqllite 3. В таблице есть поле autoincrement. Как можно получит значение этого поле после вставки записи?

Код: Выделить всё

 dmSalary.SQLQueryAll.Post;
 dmSalary.SQLQueryAll.ApplyUpdates;
 dmSalary.SQLTransaction.Commit;
 i:=dmSalary.SQLQueryAll.FieldByName('id').AsInteger; // вызывает ошибку
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Код: Выделить всё

dmSalary.SQLTransaction.CommitRetaining;

Еще может пригодиться 'SELECT last_insert_rowid();'
story
незнакомец
Сообщения: 8
Зарегистрирован: 24.01.2011 08:26:37

Сообщение story »

CommitRetaining не помогает, но dmSalary.SQLQueryAll.FieldByName('id').AsInteger; ошибку уже не вызывает, поле id=0.

Можно подробней где вставить SELECT last_insert_rowid()? в SQLQueryAll.insertsql?

Добавлено спустя 1 час 3 минуты 6 секунд:
Еще вопрос, пытаюсь удалить запись:
qrCompany.Delete;
qrCompany.ApplyUpdates;

Выходит ошибка: no delete query specified and failed to generate one. (no fields for inclusion in where statement found)

Что делаю неправильно?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

story писал(а):Выходит ошибка: no delete query specified and failed to generate one. (no fields for inclusion in where statement found)

У SQLQuery есть специальное свойство - DeleteSQL, его надо заполнить SQL-выражением для удаления записи.
Если удаления происходит не часто, то можно пользоваться SQLite3Connection('DELETE FROM таблица WHERE id=Значение_поля_уникального_идентификатора_записи')
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

У SQLite есть несколько системных таблиц. Чтобы разобраться получше в структуре вашей базы, откройте её с помощью sqlite studio http://sqlitestudio.one.pl/index.rvt , в настройках надо включить опцию отображения системных таблиц.
Есть таблица sqlite_sequence, вот в ней и находятся значения всех автоинкрементов таблиц в которых он объявлен. Т.е. узнать значение можно обычным SELECT

Код: Выделить всё

 SELECT seq FROM sqlite_sequence WHERE name="users"
т.е. выбираем последнее значение добавленой записи в таблице users.

Кстати, есть пару таблиц системных у которых не задан DDL (т.е. структура таблицы жестко зашита) и они в редакторе не откроются. Такая таблица например самая главная - sqlite_master. Однако запрос select * from sqlite_master прекрасно сработает и можно будет посмотреть и данные и названия полей таблицы.
story
незнакомец
Сообщения: 8
Зарегистрирован: 24.01.2011 08:26:37

Сообщение story »

С удалением разобрался достаточно было прописать ключевое поле в sqlquery и все заработало.
Ответить