Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

получить Insert Id после запроса INSERT... [D7, MSAccess via Ado]


Страницы:   1 2 3

123456711 ©   (2008-07-18 13:40:00) 

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

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

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


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

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

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

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

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

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


Ega23   (2008-07-30 12:39:00) [22]


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


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


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


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

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

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


Ega23   (2008-07-30 11:56:00) [24]

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


stas   (2008-07-30 11:51:00) [25]

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


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

Может и глупость, что было-то было... и работало.
Как заметил 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:38:00) [27]

Ega23 ©   (30.07.08 11:30) [31]

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


Ega23   (2008-07-30 11:30:00) [28]


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


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


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

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

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


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

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


Anatoly Podgoretsky   (2008-07-30 11:18:00) [31]


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

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


Anatoly Podgoretsky   (2008-07-30 11:16:00) [32]


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

Везет.


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

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


Anatoly Podgoretsky   (2008-07-30 10:49:00) [34]

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


Ega23   (2008-07-30 10:44:00) [35]


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


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


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

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


Ega23   (2008-07-30 10:01:00) [37]


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


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


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


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

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


Ega23   (2008-07-29 11:52:00) [39]


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


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


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

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо