Автоинкрементное поле Access
Модератор: Модераторы
Автоинкрементное поле Access
Господа, возник небольшой вопрос. С помощью SQLDB через ODBC подключаю базу MS Access, в таблице имеется автоинкрементное поле, оно же первичный ключ, как получить его значение сразу после вставки? Можно поставить вопрос более обще, как вообще получить значение любого автогенерируемого поля через ODBC и SQLDB? Проблема автогенерируемого первичного ключа как вообще решается в SQLDB?
Непонятен вопрос. С помощью запроса получить значение поля не удаётся?
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Для MS Access - SELECT @@IDENTITY
а в разных серверах баз разные средства, читайте документацию
а в разных серверах баз разные средства, читайте документацию
Vadim писал(а):Непонятен вопрос. С помощью запроса получить значение поля не удаётся?
Ну так поле-то первичный ключ, не получится запрос составить.
Снег Север писал(а):Для MS Access - SELECT @@IDENTITY
Это я читал, но как это сделать, как запрос то выполнить?
Mikhail писал(а):Ну так поле-то первичный ключ, не получится запрос составить.
Почему?
Впрочем, с Access я уже лет 20 не работал, ибо какашка. Может там уже запретили к определённым полям в запросе обращаться?
Mikhail писал(а):Это я читал, но как это сделать, как запрос то выполнить?
Вы не знаете, как работать с TSQLQuery?
Vadim писал(а):Почему?
Потому что в запросе нужно первичный ключ указать, который неизвестен. Эта же проблема будет во всех СУБД, где есть авто инкрементируемое поле. Нужен внешний механизм для получения значения такого поля.
Vadim писал(а):Вы не знаете, как работать с TSQLQuery?
Где я должен написать подобный запрос? Как получить результат такого запроса?
Mikhail писал(а):Потому что в запросе нужно первичный ключ указать, который неизвестен.
В запросе ключи не указываются. В запросе указываются названия полей.
Давайте подойдём к этому вопросу с другой стороны:
- Вам неизвестна структура таблицы к которой Вы делаете запрос?
Mikhail писал(а):Где я должен написать подобный запрос? Как получить результат такого запроса?
Код: Выделить всё
SQLQuery.SQL.Text:='SELECT @@IDENTITY';
SQLQuery.Open;
Последний раз редактировалось Vadim 15.03.2019 18:23:25, всего редактировалось 1 раз.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Mikhail, запрос пишется в TSQLQuery.SQL.Text, результат - TSQLQuery.Fields[0].AsInteger
Vadim писал(а):В запросе ключи не указываются. В запросе указываются названия полей.
Код: Выделить всё
select * from tabl where id = :id;вот id здесь после вставки будет неизвестен.
Снег Север писал(а):Mikhail, запрос пишется в TSQLQuery.SQL.Text, результат - TSQLQuery.Fields[0].AsInteger
Т.е. надо будет завести еще один SQLQuery для получения значения ключа? Ну допустим, а как его положить в буфер только что созданной записи?
Mikhail писал(а):вот id здесь после вставки будет неизвестен.
Код: Выделить всё
SELECT MAX(id) FROM tabl;И после этого id будет известен...
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
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;
примерно так
Vadim писал(а):И после этого id будет известен...
Грязный хак.
Снег Север писал(а):Не понимаю. Что за буфер и зачем туда помещать ID?
Спасибо так понятно, я имел в виду как это провернуть для Data-aware элементов управления. Они ведь берут данные из DataSet-а, а там значения автоинкрементируемого поля нет. Например DbGrid.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Mikhail писал(а):Они ведь берут данные из DataSet-а, а там значения автоинкрементируемого поля нет
Кто вам мешает включить это поле в select? После вставки делаете Refresh DataSet-а и видите вставленные записи. По крайней мере - в Access. В более серьезных базах придется еще коммитом транзакций заморачиваться.
Снег Север писал(а):Mikhail писал(а):Они ведь берут данные из DataSet-а, а там значения автоинкрементируемого поля нет
Кто вам мешает включить это поле в select? После вставки делаете Refresh DataSet-а и видите вставленные записи. По крайней мере - в Access. В более серьезных базах придется еще коммитом транзакций заморачиваться.
Желательно делать только рефреш добавленной записи, а не всего датасета.
Mikhail писал(а):Грязный хак.
Вы что, о языке запросов от меня только что узнали?
Добавлено спустя 1 минуту 46 секунд:
Mikhail писал(а):Желательно делать только рефреш добавленной записи, а не всего датасета.
У Вас в датасете что, несколько миллионов записей?
