Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Вниз

получить Insert Id после запроса INSERT...   Найти похожие ветки 

 
123456711   (2008-07-18 13:40) [0]

... у базы Standart Jet DB (Access) через Ado.

Другими словами вставляю строку в таблицу у которой поле [id] - счетчик. Как получить значение этого счетчика после вставки?

Интересует все, кроме метода Select max([id]) FROM [SomeTable].


 
Сергей М. ©   (2008-07-18 13:56) [1]

А другие уникальные ключи у этой таблицы имеются ?
Допускается ли модификация структуры таблицы для решения задачи ?
Допускается ли одновременная работа с таблицей в контексте более чем одной транзакции одновременнно ?


 
Palladin ©   (2008-07-18 13:56) [2]

select @@Identity


 
stas ©   (2008-07-18 14:02) [3]

Palladin ©   (18.07.08 13:56) [2]
Это Access


 
sniknik ©   (2008-07-18 14:09) [4]

> Это Access
да, это все меняет... тогда надо select @@Identity


 
123456711   (2008-07-18 14:16) [5]


> Palladin ©   (18.07.08 13:56) [2]
>
> select @@Identity
>

Спасибо! Как раз то, что нужно!


 
stas ©   (2008-07-18 14:24) [6]

Palladin ©   (18.07.08 13:56) [2]
Работает! незнал.
sniknik ©   (18.07.08 14:09) [4]
ага :)


 
Anatoly Podgoretsky ©   (2008-07-18 15:54) [7]

stas ©   (18.07.08 14:02) [3]
Ты укоряешь или хвастуешься незнанием?


 
MsGuns ©   (2008-07-18 16:15) [8]

Указанный селест должен следовать непосредственно после запроса на вставку в одном и том же TADOCommand, и считывать его через _RecordSet, полученный от него:

var
 cm: TADOCommand;
 ds: TADOQuery;
..

cm := TADOCommand.Create(nil);
cm.Connecton := ..
cm.CommandText := "Insert ...   "+" Select @@indentity";
ds := TADOQuery.Create(nil);
ds.recordset := cm.execute;
NewID :=  ds.recordset.Fields[0].AsInteger;
ds.Free;
cm.Free;

Try .. finally/except сами поставите ;)


 
stas ©   (2008-07-18 16:16) [9]

Anatoly Podgoretsky ©   (18.07.08 15:54) [7]
stas ©   (18.07.08 14:24) [6]


 
sniknik ©   (2008-07-18 16:30) [10]

> Указанный селест должен следовать непосредственно после запроса на вставку в одном и том же TADOCommand, и считывать его через _RecordSet,
> полученный от него:
вовсе не обязательно мудрить с TADOCommand и _RecordSet -ом.
что действительно нужно так это общий конект (TADOConnection) у обоих (TADOCommand, TADODataSet) и синхронное выполнение запросов (что по умолчанию), ну и считывать сразу после вставки само собой.


 
ANB   (2008-07-18 16:42) [11]


> sniknik ©   (18.07.08 16:30) [10]

В мс скл не поможет. Там только в одной команде должно идти.

В аксесс - не знаю.


 
MsGuns ©   (2008-07-18 16:47) [12]

>sniknik ©   (18.07.08 16:30) [10]
>вовсе не обязательно мудрить с TADOCommand и _RecordSet -ом.

Не вижу ничего мудреного. В конце концнв можно написать универсальную функцию и подключить ее к делфе.

>что действительно нужно так это общий конект (TADOConnection) у обоих (TADOCommand, >TADODataSet) и синхронное выполнение запросов (что по умолчанию), ну и считывать сразу >после вставки само собой.

Этого может быть недостаточно


 
sniknik ©   (2008-07-18 16:54) [13]

> В мс скл не поможет.
а не про mssql разговор.

> Этого может быть недостаточно
достаточно с гарантией...


 
stas ©   (2008-07-21 10:38) [14]

ANB   (18.07.08 16:42) [11]
в mssql если есть триггер на таблице на insert в другую таблицу, то и в одной команде непоможет, нужно функцию использовать.


 
Anatoly Podgoretsky ©   (2008-07-21 11:06) [15]

stas ©   (21.07.08 10:38) [14]
Чукча не читатель!
Сказали же, что про mssql речь не идет.


 
stas ©   (2008-07-21 12:07) [16]

Anatoly Podgoretsky ©   (21.07.08 11:06) [15]
Да знаю я.
Ну, раз уж затронули mssql....


 
Dmitry S ©   (2008-07-22 15:02) [17]


> Сказали же, что про mssql речь не идет.

Сори за офтоп.
Вот мне интересно, откуда берется множественное число в подобных фразах. Для преувеличения значимости сказанного? Или это попытка манипуляции с помощью общества?


 
Johnmen ©   (2008-07-22 17:36) [18]


> Dmitry S ©   (22.07.08 15:02) [17]

В соответствии с нормами русского языка. Ничего более.
Для тех, кто писатель, не читатель.


 
Нат   (2008-07-29 11:28) [19]

Как упоминалось можно найти запись по другим ключам.
Например,  если есть поле ДатаВремя создания записи - найти свой ИД по нему, но есть моменты со вставкой и поиском.
Еще можно  Recynс-Requery + bookmark использовать.
Но это все медленнее.


 
Ega23 ©   (2008-07-29 11:52) [20]


> Например,  если есть поле ДатаВремя создания записи - найти
> свой ИД по нему


Не получится.


 
Нат   (2008-07-29 18:56) [21]


> Не получится.

У меня получалось.  Но без изящества.


 
Ega23 ©   (2008-07-30 10:01) [22]


> У меня получалось.


Это просто повезло. На равенство DateTime сверять - глупо, надо на больше-равно - меньше-равно. А так - высока вероятность того, что кто-то ещё кроме тебя успеет это захватить.
В общем, не получится так.


 
Нат   (2008-07-30 10:38) [23]

d := now(); ... insert ... select или look
безо всяких больше либо...
строго равно! до долей секунды
и все получается.


 
Ega23 ©   (2008-07-30 10:44) [24]


> и все получается.


Тебе просто повезло.
1. Ты ещё, похоже, не натыкался на проблему с синхронизацией времени в сети.
2. Ты ещё, похоже, не натыкался на проблему с переходом на зимнее время.


 
Anatoly Podgoretsky ©   (2008-07-30 10:49) [25]

Для подобных дурных подходов есть аппробированое решение - поиск сравнение по всем полям, реализовано в DB.VCL если не применять особых методов, условие не использовать никаких идентифицирующих полей, главное удалить ПК если он есть.


 
Нат   (2008-07-30 11:05) [26]

Подход так себе, через голову.О чем сразу было сказано.
Но работает.
И везение не при чем. Пришлось морщить лоб.
В том случае еще имелось поле Autor, поэтому захватить чужую запись с таким же временем (буде повезет) проблематично.


 
Anatoly Podgoretsky ©   (2008-07-30 11:16) [27]


> и все получается.

Везет.


 
Anatoly Podgoretsky ©   (2008-07-30 11:18) [28]


> Ega23 ©   (30.07.08 10:44) [24]

3. и не понимает устройства типа TDateTime
4. и не понимает принципов работы с плавающей запятой
5. и не понимает принципов работы SQL серверов, где (Fld = Value) <> Value


 
stas ©   (2008-07-30 11:26) [29]

>Нат
Искать по времени свой ID это глупости
1. Быстрее будет уже (Select Max(ID) from mytable).
2. поле датавремя точность до милисекунд, а знаешь сколько транзакций может пройти в одну милисекунду?
3. и зачем изобретать что-то если есть стандартные средства определения ID.


 
Нат   (2008-07-30 11:28) [30]

Я здесь.
Скажите ты, иначе это грубость, профессор.

Я чего не понимаю, стараюсь учиться.


 
Ega23 ©   (2008-07-30 11:30) [31]


> 1. Быстрее будет уже (Select Max(ID) from mytable).


Да нельзя так делать, ёлы-палы!!!
Ну где гарантия того, что это - именно твоя вставка, а не соседнего клиента, который выполнял вставку сразу за тобой??


 
stas ©   (2008-07-30 11:38) [32]

Ega23 ©   (30.07.08 11:30) [31]

Конечно нельзя, но если уж выбирать по дате или (Select Max(ID) from mytable), то лучше последнее.


 
Нат   (2008-07-30 11:47) [33]

Может и глупость, что было-то было... и работало.
Как заметил Ega23,  (Select Max(ID) from mytable) еще менее надежный вариант.
Хотя он гораздо изящнее варианта с датой. Там нужно изголяться в силу

> устройства типа TDateTime

К слову, он был заменен на ... что Вы думаете?
id:=ExecSQL ("Select max([id])+1 FROM [SomeTable]")
TDataSet. Insert(id)
если ошибка - то заново.
И кажется, на так и жило.

Просто был задан вопрос

> Интересует все, кроме метода Select max([id]) FROM [SomeTable].


 
stas ©   (2008-07-30 11:51) [34]

Нат   (30.07.08 11:47) [33]
Так это уже вы автоинкримент выдумываете, а вопрос был как определить значение автоинкремента после вставки.


 
Ega23 ©   (2008-07-30 11:56) [35]

Тогда уж давай будем последовательным:
Select IsNull(max([id])+1, 1) FROM [SomeTable]


 
Нат   (2008-07-30 12:26) [36]


> пределить значение автоинкремента после вставки

Совсем чуть-чуть отклонились.

Ega23
IsNull(max([id])+1, 1) это лучше, но имелось в виду другое.
Принципиальное отличие - вставка не запросом, а DataSet.Insert ...
Т.е. определяем ДО вставки, вставляем и остаемся на нужной записи.
И никаких поисков уже не надо.


 
Ega23 ©   (2008-07-30 12:39) [37]


> Т.е. определяем ДО вставки, вставляем и остаемся на нужной
> записи.


Я понял, что имелось ввиду. Но один фиг, это всё надо одним скриптом делать.
Я Max+1 выберу, а вставку данных в грид ещё не закончу.
В это время Max+1 выберет Вася Пупкин (а значение - то же самое, я ещё данные не закомиттил), быстрее меня забьёт данные, сделает коммит, и я получу insert error.


 
Нат   (2008-07-30 12:56) [38]

Точно. Тогда и все на повтор.

> TDataSet. Insert(id)если ошибка - то заново.

А просто запросом - вообще без гарантии от Васи. Залеты были чаще, чем с датой.
Сложно придумать лучше, чем:

> да, это все меняет... тогда надо select @@Identity

Разве что прямо на серверной стороне... ну там свои штуки.


 
stas ©   (2008-07-30 13:14) [39]

есть @@Identity, чего еще заморачиваться?


 
Anatoly Podgoretsky ©   (2008-07-30 13:30) [40]

> stas  (30.07.2008 11:51:34)  [34]

А там он определен, если ты не заметил.



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.051 c
3-1215762007
Viod
2008-07-11 11:40
2009.03.29
Stream and AdoCommand


6-1201598586
valenok
2008-01-29 12:23
2009.03.29
Использование ReadLn в компоненте IdTCPServer


4-1205434654
Blacksus
2008-03-13 21:57
2009.03.29
Программное управление проводником Windows


11-1198047594
Бельчонок
2007-12-19 09:59
2009.03.29
DLL - поток (TKOLThread) - Форма


15-1233122782
Труп Васи Доброго
2009-01-28 09:06
2009.03.29
Windows 7 первые впечатления





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский