Форум: "Базы";
Текущий архив: 2014.02.09;
Скачать: [xml.tar.bz2];
ВнизКак получить идентификатор записи? Найти похожие ветки
← →
well © (2010-12-13 14:00) [0]БД Oracle.
Есть таблица. Поле ID инкрементный идентификатор, который определяется триггером в базе.
В программе данные отображаются через DBGrid. Связь с таблицей , связь через ADOQuery.
При вставке новой записи поле ID отображается как "0", хотя реальное значение отличается от нуля.
Реальное значение появляется после
Active=false
Active=true
Либо после перезапуска программы.
Можно ли получить значение поля без перезапуска?
← →
Ega23 © (2010-12-13 14:07) [1]
> Можно ли получить значение поля без перезапуска?
Надо обновлять НД.
← →
well © (2010-12-13 14:11) [2]НД это что?
← →
Ega23 © (2010-12-13 14:11) [3]Набор данных.
← →
well © (2010-12-13 14:12) [4]Набор данных?
← →
well © (2010-12-13 14:21) [5]Но тут появляется одна проблема. Курсор слетает с записи. Тоесть становится на первую запись в таблице. Можно ли его зафиксировать на обновляемой строке? Или придётся производить поиск?
← →
Ega23 © (2010-12-13 14:22) [6]Нет, блин, набор микроскопов.
У тебя изначально твой НД понятия не имеет, какой ID будет сгенерен триггером. Соответственно, чтобы узнать надо его обновить. Либо в 2 транзакции делать, сначала NextID получить, а потом с ним вставлять запись.
← →
Ega23 © (2010-12-13 14:23) [7]
> Можно ли его зафиксировать на обновляемой строке?
В общем случае - нет, поскольку ты не знаешь, какой именно ID будет.
← →
well © (2010-12-13 14:43) [8]Тоесть чтобы вставить строку, получить ID и вернуться на эту запись нужно:
1. определить LAST_NUMBER
2. обновить DataSet
3. произвести поиск записи c ID равным LAST_NUMBER
Проще наверное нельзя?
← →
Ega23 © (2010-12-13 14:50) [9]Можно. Но по твоим условиям задачи - нельзя.
← →
Petr V. Abramov © (2010-12-13 15:02) [10]
> Есть таблица. Поле ID инкрементный идентификатор, который
> определяется триггером в базе.
автоинкрмента как такового в оракле нет, есть т.н. sequence`ы.
есои точно испольуется триггер, в нем написано что-то типа
:new.ID := MySequence.nextval
в твой ситуации, если известно имя сиквенса, в программе его текущее значение можно получить как MySequence.currval.
с параллельным доступом тоже все хорошо разрулено, currval дает значение для текущей сессии, т.е. ровно то, что вернул последний nextval в твоей сессии
← →
well © (2010-12-13 15:11) [11]Ну да, тут триггер ссылается на нужный сиквенс, найти следующее значение ID не проблема.
← →
Petr V. Abramov © (2010-12-13 15:15) [12]
> Ну да, тут триггер ссылается на нужный сиквенс, найти следующее
> значение ID не проблема.
тебе не следующее, а текущее надо, то что вернул последний nextval
← →
well © (2010-12-13 15:32) [13]Если я хочу определить ID записи перед тем как её вставить, то я нахожу значение LAST_NUMBER из сиквенса, это и будет идентификатором новой записи.
← →
Petr V. Abramov © (2010-12-13 15:55) [14]
> well © (13.12.10 15:32) [13]
>
> Если я хочу определить ID записи перед тем как её вставить,
> то я нахожу значение LAST_NUMBER из сиквенса, это и будет
> идентификатором новой записи.
>
какое LAST_NUMBER???
перед тем как вставить ты определишь ерунду, триггер потом все равно вызовет nextval, а что он вернет, известно только ктулху, и именно это он запишет в базу.
в общем, тебе сказали, как надо, хочешь по-своему - флаг в руки
← →
Игорь Шевченко © (2010-12-13 16:22) [15]INSERT ... RETURNING
← →
Petr V. Abramov © (2010-12-13 16:30) [16]
> Игорь Шевченко © (13.12.10 16:22) [15]
>
> INSERT ... RETURNING
в идеале да, только там уже сть триггер и прочая фигня. и insert явно ADO само формирует.
← →
Ega23 © (2010-12-13 16:49) [17]
> и insert явно ADO само формирует.
Там, судя по симптомам, DBGrid с редактированием в нём.
← →
Petr V. Abramov © (2010-12-13 16:53) [18]
> Ega23 © (13.12.10 16:49) [17]
ну да, у меня такой же диагноз :)
в общем-то, на вполне определнном круге задач это не преступление и не моветон.
← →
Игорь Шевченко © (2010-12-13 16:57) [19]
> в идеале да, только там уже сть триггер и прочая фигня
INSERT и после триггера RETURNING
← →
Petr V. Abramov © (2010-12-13 17:04) [20]
> Игорь Шевченко © (13.12.10 16:57) [19]
>
>
да это понятно, только автору все перепахивать, а так малой кровью, тем более, ему, похоже, оракл - вражеская территория :)
← →
well © (2010-12-15 12:27) [21]Перепахивать мне всё равно придётся, а главное могу делать вылазки на вражескую территорию :)
← →
ANB (2010-12-27 18:16) [22]ADO + Oracle - не самая лучшая комбинация.
← →
DiamondShark © (2011-01-11 18:58) [23]
> ADO + Oracle - не самая лучшая комбинация.
Да они и по отдельности не фонтан
← →
adigozelov © (2011-01-11 22:30) [24]Kakda ti deliyis insert adoxxx tolka citayit identiy a katoruy krome identity dayit server ili po umolconuy polyi ado ni znayit.
i ani v Dbgridi atabrajayitsa kak null ili 0
Yes metot: dinamiciski svoystva Ado Update Resync
adResyncNone Никаких обновлений данных на стороне клиента после добавления или изменения не производится
adResyncAutoIncrement После добавления новых строк считывается значение автоинкрементного поля (новое Identity) Это значение Update Resync принято по умолчанию
adResyncUpdates После изменения строки - измененная строка тут же считывается с сервера
adResyncInserts После добавления строки новая строка сразу же считывается с сервера
adResyncConflicts В случае ошибки, связанной с конфликтом при конкурирующим обновлении с сервера считывается значение строки, вызвавшей конфликт
adResyncAll Комбинация из всех возможных значений свойства Update Resync
begin
if not ADODataSet1.Active then ADODataSet1.Open;
ADODataSet1.Properties["Update Resync"].Value:= adResyncInserts+adResyncInserts;
end;
← →
adigozelov © (2011-01-11 22:33) [25]Tois nimnoska asibalsa
begin
if not ADODataSet1.Active then ADODataSet1.Open;
ADODataSet1.Properties["Update Resync"].Value:= adResyncAutoIncrement+adResyncInserts;
end;
← →
Ega23 © (2011-01-12 00:41) [26]
if not ADODataSet1.Active then ADODataSet1.Open;
Это лишнее, загляни в код метода Open
← →
Германн © (2011-01-12 00:54) [27]
> Это лишнее
Это привычка :)
← →
Ega23 © (2011-01-12 11:41) [28]
> Это привычка :)
Дурная привычка, надо в код смотреть, с D5 ничего не менялось (а может и с более ранних, не знаю).
← →
Anatoly Podgoretsky © (2011-01-12 12:14) [29]> Германн (12.01.2011 00:54:27) [27]
Ты наверно так же и Close вызываешь.
← →
Anatoly Podgoretsky © (2011-01-12 12:16) [30]> Ega23 (12.01.2011 11:41:28) [28]
TDataset базовый класс, существует с Д1
← →
Ega23 © (2011-01-12 12:47) [31]
> TDataset базовый класс, существует с Д1
Я D1 один раз в жизни видел. Издалека.
← →
DiamondShark © (2011-01-12 14:10) [32]
> Ega23 © (12.01.11 11:41) [28]
> Дурная привычка, надо в код смотреть
Смотреть в код -- вот дурная привычка.
А придерживаться разумных патернов -- нормальная привычка.
← →
Ega23 © (2011-01-12 14:21) [33]
> Смотреть в код -- вот дурная привычка.
> А придерживаться разумных патернов -- нормальная привычка.
>
Дадад. И надо каждый раз писатьADOQuery1.SQL.Clear;
,
ADOQuery1.SQL.Add(....)List.Clear;
List.Free;
ну и как апофеозif ADOQuery1.Active then
ADOQuery1.Close;
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("select * from ...");
try
ADOQuery1.Open;
....
except on E: Exception do
....
end;
finally
if ADOQuery1.Active then
ADOQuery1.Close;
end;
← →
Anatoly Podgoretsky © (2011-01-12 14:43) [34]> Ega23 (12.01.2011 14:21:33) [33]
Надо использовать TAdoDataset
← →
DiamondShark © (2011-01-12 16:40) [35]
> Ega23 © (12.01.11 14:21) [33]
Ты наркоман, штоле?
← →
Ega23 © (2011-01-12 16:44) [36]
> Ты наркоман, штоле?
Нет, я в код смотрю.
← →
DiamondShark © (2011-01-12 17:28) [37]
> Ega23 © (12.01.11 16:44) [36]
> Нет, я в код смотрю.
Ты эта, ты в такой код больше не смотри. Затягивает.
← →
Ega23 © (2011-01-12 17:54) [38]
> Ты эта, ты в такой код больше не смотри. Затягивает.
Ты не тот объект для троллинга выбрал.
← →
DiamondShark © (2011-01-12 18:04) [39]Удалено модератором
← →
ANB (2011-01-12 18:11) [40]
> Да они и по отдельности не фонтан
ADO - согласен
Oracle - назови лучшую СУБД (кроме ADABASE :) )
Страницы: 1 2 3 4 5 вся ветка
Форум: "Базы";
Текущий архив: 2014.02.09;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.005 c