Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
8-1233922362
DesWind
2009-02-06 15:12
2014.02.09
Выделение полезного сигнала


2-1364804378
dmitry87
2013-04-01 12:19
2014.02.09
работа с sqlite в xe3


2-1365018269
ProgRAMmer Dimonych
2013-04-03 23:44
2014.02.09
Как правильно реализовать AutoSize?


2-1365523647
SKIPtr
2013-04-09 20:07
2014.02.09
обращение к секторам диска


1-1321910834
Mr.Devil
2011-11-22 01:27
2014.02.09
Ошибка при инициализации приложения (0xc0000005)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский