SQldb autoincrement

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

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

SQldb autoincrement

Сообщение story » 27.01.2011 10:26:11

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

Код: Выделить всё
dmSalary.SQLQueryAll.Post;
dmSalary.SQLQueryAll.ApplyUpdates;
dmSalary.SQLTransaction.Commit;
i:=dmSalary.SQLQueryAll.FieldByName('id').AsInteger; // вызывает ошибку
story
незнакомец
 
Сообщения: 8
Зарегистрирован: 24.01.2011 09:26:37

Re: SQldb autoincrement

Сообщение v-t-l » 27.01.2011 12:48:45

Код: Выделить всё
dmSalary.SQLTransaction.CommitRetaining;

Еще может пригодиться 'SELECT last_insert_rowid();'
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: SQldb autoincrement

Сообщение story » 27.01.2011 13:25:54

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)

Что делаю неправильно?
story
незнакомец
 
Сообщения: 8
Зарегистрирован: 24.01.2011 09:26:37

Re: SQldb autoincrement

Сообщение Vadim » 27.01.2011 15:17:40

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=Значение_поля_уникального_идентификатора_записи')
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: SQldb autoincrement

Сообщение EmeraldMan » 28.01.2011 00:11:49

У 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 прекрасно сработает и можно будет посмотреть и данные и названия полей таблицы.
Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород

Re: SQldb autoincrement

Сообщение story » 28.01.2011 07:07:43

С удалением разобрался достаточно было прописать ключевое поле в sqlquery и все заработало.
story
незнакомец
 
Сообщения: 8
Зарегистрирован: 24.01.2011 09:26:37


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30

Рейтинг@Mail.ru