![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить идентификатор записи?
well © (2010-12-13 14:00:00)
Страницы: < 1 2 3 4 5 6 7 8 9 10
БД 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]
> Можно ли получить значение поля без перезапуска?
Надо обновлять НД.