Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.29;
Скачать: CL | DM;

Вниз

получить 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.02 c
4-1206779666
kalexi
2008-03-29 11:34
2009.03.29
Как узнать с какого по какой адрес занимает процесс в системе?


2-1234260141
Игорь
2009-02-10 13:02
2009.03.29
MOUSEHOOKSTRUCT


15-1232646798
Kerk
2009-01-22 20:53
2009.03.29
mod_negotiation


15-1232519912
TUser
2009-01-21 09:38
2009.03.29
Большой адронный коллайдер и физические исследования на нем


2-1233266659
Тимоха
2009-01-30 01:04
2009.03.29
непонятки со string