Автоинкрементное поле Access

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

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

Автоинкрементное поле Access

Сообщение Mikhail » 15.03.2019 14:31:40

Господа, возник небольшой вопрос. С помощью SQLDB через ODBC подключаю базу MS Access, в таблице имеется автоинкрементное поле, оно же первичный ключ, как получить его значение сразу после вставки? Можно поставить вопрос более обще, как вообще получить значение любого автогенерируемого поля через ODBC и SQLDB? Проблема автогенерируемого первичного ключа как вообще решается в SQLDB?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение Vadim » 15.03.2019 16:41:47

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

Re: Автоинкрементное поле Access

Сообщение Снег Север » 15.03.2019 17:48:46

Для MS Access - SELECT @@IDENTITY
а в разных серверах баз разные средства, читайте документацию
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Автоинкрементное поле Access

Сообщение Mikhail » 15.03.2019 17:55:38

Vadim писал(а):Непонятен вопрос. С помощью запроса получить значение поля не удаётся?

Ну так поле-то первичный ключ, не получится запрос составить.

Снег Север писал(а):Для MS Access - SELECT @@IDENTITY

Это я читал, но как это сделать, как запрос то выполнить?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение Vadim » 15.03.2019 18:34:28

Mikhail писал(а):Ну так поле-то первичный ключ, не получится запрос составить.

Почему?
Впрочем, с Access я уже лет 20 не работал, ибо какашка. Может там уже запретили к определённым полям в запросе обращаться?
Mikhail писал(а):Это я читал, но как это сделать, как запрос то выполнить?

Вы не знаете, как работать с TSQLQuery?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Автоинкрементное поле Access

Сообщение Mikhail » 15.03.2019 19:02:17

Vadim писал(а):Почему?

Потому что в запросе нужно первичный ключ указать, который неизвестен. Эта же проблема будет во всех СУБД, где есть авто инкрементируемое поле. Нужен внешний механизм для получения значения такого поля.

Vadim писал(а):Вы не знаете, как работать с TSQLQuery?


Где я должен написать подобный запрос? Как получить результат такого запроса?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение Vadim » 15.03.2019 19:21:56

Mikhail писал(а):Потому что в запросе нужно первичный ключ указать, который неизвестен.

В запросе ключи не указываются. В запросе указываются названия полей.
Давайте подойдём к этому вопросу с другой стороны:
- Вам неизвестна структура таблицы к которой Вы делаете запрос?
Mikhail писал(а):Где я должен написать подобный запрос? Как получить результат такого запроса?

Код: Выделить всё
SQLQuery.SQL.Text:='SELECT @@IDENTITY';
SQLQuery.Open;
Последний раз редактировалось Vadim 15.03.2019 19:23:25, всего редактировалось 1 раз.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Автоинкрементное поле Access

Сообщение Снег Север » 15.03.2019 19:22:11

Mikhail, запрос пишется в TSQLQuery.SQL.Text, результат - TSQLQuery.Fields[0].AsInteger
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Автоинкрементное поле Access

Сообщение Mikhail » 15.03.2019 19:30:23

Vadim писал(а):В запросе ключи не указываются. В запросе указываются названия полей.


Код: Выделить всё
select * from tabl where id = :id;


вот id здесь после вставки будет неизвестен.

Снег Север писал(а):Mikhail, запрос пишется в TSQLQuery.SQL.Text, результат - TSQLQuery.Fields[0].AsInteger

Т.е. надо будет завести еще один SQLQuery для получения значения ключа? Ну допустим, а как его положить в буфер только что созданной записи?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение Vadim » 15.03.2019 19:33:12

Mikhail писал(а):вот id здесь после вставки будет неизвестен.

Код: Выделить всё
SELECT MAX(id) FROM tabl;

И после этого id будет известен... ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Автоинкрементное поле Access

Сообщение Снег Север » 15.03.2019 20:58:14

Mikhail писал(а):Т.е. надо будет завести еще один SQLQuery для получения значения ключа?

Можно использовать один и тот же, по очереди - сделал вставку, прочитал новый ID.
Mikhail писал(а):Ну допустим, а как его положить в буфер только что созданной записи?

Не понимаю. Что за буфер и зачем туда помещать ID? ID будет нужен для какого-то следующего запроса.

Добавлено спустя 14 минут 19 секунд:
Код: Выделить всё
var id :integer;
...
SQLQuery.SQL.Text := 'INSERT ...'; // вставка
SQLQuery.Execute;
SQLQuery.SQL.Text:='SELECT @@IDENTITY';
SQLQuery.Open;
id := SQLQuery.Fields[0].AsInteger;
SQLQuery.Close;
SQLQuery.SQL.Text:='select * from tabl where id = :id;'
SQLQuery.Params.ParamByName('id').AsInteger := id;
SQLQuery.Open;


примерно так
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Автоинкрементное поле Access

Сообщение Mikhail » 15.03.2019 21:22:12

Vadim писал(а):И после этого id будет известен...

Грязный хак. :D

Снег Север писал(а):Не понимаю. Что за буфер и зачем туда помещать ID?

Спасибо так понятно, я имел в виду как это провернуть для Data-aware элементов управления. Они ведь берут данные из DataSet-а, а там значения автоинкрементируемого поля нет. Например DbGrid.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение Снег Север » 15.03.2019 21:39:09

Mikhail писал(а):Они ведь берут данные из DataSet-а, а там значения автоинкрементируемого поля нет

Кто вам мешает включить это поле в select? После вставки делаете Refresh DataSet-а и видите вставленные записи. По крайней мере - в Access. В более серьезных базах придется еще коммитом транзакций заморачиваться.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Автоинкрементное поле Access

Сообщение Mikhail » 15.03.2019 21:44:52

Снег Север писал(а):
Mikhail писал(а):Они ведь берут данные из DataSet-а, а там значения автоинкрементируемого поля нет

Кто вам мешает включить это поле в select? После вставки делаете Refresh DataSet-а и видите вставленные записи. По крайней мере - в Access. В более серьезных базах придется еще коммитом транзакций заморачиваться.


Желательно делать только рефреш добавленной записи, а не всего датасета.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение Vadim » 16.03.2019 04:42:10

Mikhail писал(а):Грязный хак.

Вы что, о языке запросов от меня только что узнали?

Добавлено спустя 1 минуту 46 секунд:
Mikhail писал(а):Желательно делать только рефреш добавленной записи, а не всего датасета.

У Вас в датасете что, несколько миллионов записей?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 33

Рейтинг@Mail.ru