![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADO - Access - Как получить значение сгенеренного ID - counter [D6, Access]
ike © (2005-06-02 11:22:00)Есть база Access. Вставляю новую запись в таблицу (TADOQuery), в которой первичный ключ с типом Counter. После чего мне надо вставить ещё записи в таблицы, где этот ключ тоже входит в состав первичного ключа. Нужно получить его значение и втавить соответствующие записи в эти таблицы. Сделать нужно в одной транзакции. В SQL сереверах это делается просто через хранимую процедуру, а как это можно в Access организовать?
Anatoly Podgoretsky (2005-06-02 15:00:00) [1]@@IDENTITY
Sergey13 (2005-06-02 12:45:00) [2]2ike (02.06.05 11:22)
>В SQL сереверах это делается просто
И что людей заставляет ими непользоваться? А потом еще пытаться сделать что либо "в одной транзакции".
8-)
ЮЮ (2005-06-02 12:40:00) [3]>msguns © (02.06.05 11:36) [1]
При таком подходе проще избавиться от Counter-а, заменив на Integer.
Кстати не обязательно MAX(ID)+1 должен дать правильное значение. А что если запись была добавлена, а потом удалена. Это только Access XP при очиске таблицы и насильственной вставки записи с меньшим Id сбрасывает счетчик (такая метода дана даже в Неlp-e, уж-ж-ж-ас), а, например, в Access 2000, счетчик продолжает в этом случае благополучно нарастать
msguns (2005-06-02 12:24:00) [4]выборка ID производится один раз для каждой вставляющей в Мастер-таблицу операции. Это же значение используется при вставках всех записей всех Detail-таблиц.
Однако, если использовать связь Master-Detail (DetailQuery.DataSource := MasterDataSource), то при вставках в деталы заполнение мастер-ключа будет производится автоматически.
ike (2005-06-02 12:11:00) [5]Если я правильно понял, то мне вначале нужно получить значение будующего ID (max(id)+1). А каждую операцию INSERT с этим ID я должен в отдельных Query/Command etc выполнять?
msguns (2005-06-02 11:36:00) [6]Для акцесса (однопользовалка) можно использовать запрос
SELECT MAX(ID)+1 FROM TABLE, а затем
..
Open;
INSERT INTO TABLE ID,... VALUES (:ID,...)
ADOCommand1.ParamByName('ID').Value := ADOQueryGetID.Fields[0].AsInteger;