Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить идентификатор записи?


Страницы:   1 2 3 4 5 6 7 8 9 10

well ©   (2010-12-13 14:00:00) 

БД Oracle.
Есть таблица. Поле ID инкрементный идентификатор, который определяется триггером в базе.

В программе данные отображаются через DBGrid. Связь с таблицей , связь через ADOQuery.

При вставке новой записи поле ID отображается как "0", хотя реальное значение отличается от нуля.
Реальное значение появляется после  
Active=false
Active=true
Либо после перезапуска программы.

Можно ли получить значение поля без перезапуска?


Petr V. Abramov   (2010-12-13 15:55:00) [181]


> well ©   (13.12.10 15:32) [13]
>
> Если я хочу определить ID записи перед тем как её вставить,
>  то я нахожу значение LAST_NUMBER из сиквенса, это и будет
> идентификатором новой записи.
>

какое LAST_NUMBER???
перед тем каквставить ты определишь ерунду, триггер потом все равно вызовет nextval, а что он вернет, известно только ктулху, и именно это он запишет в базу.
в общем, тебе сказали, как надо, хочешь по-своему - флаг в руки


well   (2010-12-13 15:32:00) [182]

Если я хочу определить ID записи перед тем как её вставить, то я нахожу значение LAST_NUMBER из сиквенса, это и будет идентификатором новой записи.


Petr V. Abramov   (2010-12-13 15:15:00) [183]


> Ну да, тут триггер ссылается на нужный сиквенс, найти следующее
> значение ID не проблема.

тебе не следующее, а текущее надо, то что вернул последний nextval


well   (2010-12-13 15:11:00) [184]

Ну да, тут триггер ссылается на нужный сиквенс, найти следующее значение ID не проблема.


Petr V. Abramov   (2010-12-13 15:02:00) [185]


> Есть таблица. Поле ID инкрементный идентификатор, который
> определяется триггером в базе.

автоинкрмента как такового в оракле нет, есть т.н. sequence`ы.
есои точно испольуется триггер, в нем написано что-то типа
:new.ID := MySequence.nextval

в твой ситуации, если известно имя сиквенса, в программе его текущее значение можно получить как  MySequence.currval.
с параллельным доступом тоже все хорошо разрулено, currval дает значение для текущей сессии, т.е. ровно то, что вернул последний nextval в твоей сессии


Ega23   (2010-12-13 14:50:00) [186]

Можно. Но по твоим условиям задачи - нельзя.


well   (2010-12-13 14:43:00) [187]

Тоесть чтобы вставить строку, получить ID и вернуться на эту запись нужно:
1. определить LAST_NUMBER
2. обновить DataSet
3. произвести поиск записи c ID равным LAST_NUMBER

Проще наверное нельзя?


Ega23   (2010-12-13 14:23:00) [188]


>  Можно ли его зафиксировать на обновляемой строке?


В общем случае - нет, поскольку ты не знаешь, какой именно ID будет.


Ega23   (2010-12-13 14:22:00) [189]

Нет, блин, набор микроскопов.
У тебя изначально твой НД понятия не имеет, какой ID будет сгенерен триггером. Соответственно, чтобы узнать надо его обновить. Либо в 2 транзакции делать, сначала NextID получить, а потом с ним вставлять запись.


well   (2010-12-13 14:21:00) [190]

Но тут появляется одна проблема. Курсор слетает с записи. Тоесть становится на первую запись в таблице. Можно ли его зафиксировать на обновляемой строке? Или придётся производить поиск?


well   (2010-12-13 14:12:00) [191]

Набор данных?


well   (2010-12-13 14:11:00) [192]

НД это что?


Ega23   (2010-12-13 14:11:00) [193]

Набор данных.


Ega23   (2010-12-13 14:07:00) [194]


> Можно ли получить значение поля без перезапуска?


Надо обновлять НД.


Страницы:   1 2 3 4 5 6 7 8 9 10

Наверх

Титульная страница Поиск, карта сайта Написать письмо