![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить id добавленной записи [D7, MSSQL]
ndg © (2007-01-23 20:59:00)Ситуация такова:
с помощью ADOCommand выполняю запрос
INSERT INTO Akadem (Student_ID, GoDate, AkademType, CurrentType) VALUES (:Std, :Dt, :ATp, :CTp)
После его выполнения мне надо узнать Student_ID добавленной мною записи. Подскажите, как ?
ANB (2007-01-29 13:25:00) [1]
> но... приложения лучше разрабатывать независимо от субд.
> ..
ИМХО - порочное мнение. Прямой путь к тормозам и разрастанию проекта.
Palladin (2007-01-28 06:06:00) [2]
> [19] sniknik © (24.01.07 17:55)
> не надо путать, access это не mssql у него это отслежено
> и все будет правильно
в курсе...
AFAIK mssql ado db провайдер вообще единственный кто может возвращать несколько recordset в одном контексте выполнения...
на mssql поздно внимание обратил... только начиная с [6] поста...
но... приложения лучше разрабатывать независимо от субд...
> даже в TADOQuery (хотя я его очень не одобряю)
:) знаю...
Ega23 (2007-01-26 09:03:00) [3]
> возвращает последний сгенерированный ГЛОБАЛЬНЫЙ ID на весь
> сервер.
Нет.
Johnmen (2007-01-26 00:42:00) [4]
> Yaro (26.01.07 00:31) [25]
Что такое "ГЛОБАЛЬНЫЙ ID на весь сервер"?
Yaro (2007-01-26 00:31:00) [5]Ребята, знаете в чем разница?
SELECT SCOPE_IDENTITY()
возвращает последний сгенерированный ID в пределах сеанса, процедуры и т.д.
SELECT @@Identity
возвращает последний сгенерированный ГЛОБАЛЬНЫЙ ID на весь сервер.
-----------
реально это работает так:
в MS SQL Server 2000 - так как описано выше
в MS Jet (Access) - первое вообще не работает, зато второе работает как первое.
в других провайдерах/серверах не проверял
Anatoly Podgoretsky (2007-01-25 22:20:00) [6]
> А вот в этом случае (особенно в случае триггеров) уже нельзя
> использовать @@Identity, а SCOPE_IDENTITY (см.[16])
Почему нельзя?
Еще как можно, у меня оба используются и ничего, но я знаю, что где использовать и вот в этом правда.
sniknik (2007-01-25 12:08:00) [7]> Разве могут быть другие варианты?
может быть и не могут. но разве это важно? легко избежать.
Bless (2007-01-25 10:37:00) [8]
> sniknik © (24.01.07 08:40) [7]
>
> Palladin © (23.01.07 23:09) [3]
> делить подобный пакет на 2 = добавить возможность ошибки.
> в этом случае есть ненулевая вероятность что идентити будет
> от другой команды.
Под "есть ненулевая вероятность что идентити будет от другой команды"
приходит на ум только вариант, когда через один ADOConnection
работают несколько потоков. Разве могут быть другие варианты?
ЮЮ (2007-01-25 09:22:00) [9]
> Да ну, вот ещё. А если поcле добавления надо ещё и в историю
> какую-нибудь вставку делать?
> Нафиг-нафиг, всё через хп...
а вот это триггерами обычно. ;о)) но никак не логикой программы.
А вот в этом случае (особенно в случае триггеров) уже нельзя использовать @@Identity, а SCOPE_IDENTITY (см.[16])
evvcom (2007-01-25 08:57:00) [10]> [18] ANB © (24.01.07 17:52)
> а в оракле - вместе низзя (там оно и не нужно).
Почему низзя? В begin..end заключаешь и мона. А вот насчет "не нужно", тут ты прав. В Оракле более изящный способ имеется.
sniknik (2007-01-24 17:55:00) [11]> я писал здесь, потому и использовал TADOQuery, написать было проще... главное принцип донес...
даже в TADOQuery (хотя я его очень не одобряю) можно было/правильно написать команды пакетом, а не разносить.
> зя или низя это лучше у accessa спросить... расскажи как зя выполнить два в одном на джете...
не надо путать, access это не mssql у него это отслежено и все будет правильно, у него @@identity это локальная переменная сом обьекта (инстанса) т.е. не пересекается с другими параллельно открытыми.
ANB (2007-01-24 17:52:00) [12]
> зя или низя это лучше у accessa спросить... расскажи как
> зя выполнить два в одном на джете...
а причем тут акксесс ?
в мсскл по отдельности низзя. а в оракле - вместе низзя (там оно и не нужно).
Palladin (2007-01-24 17:45:00) [13]
> [7] sniknik ©
я писал здесь, потому и использовал TADOQuery, написать было проще... главное принцип донес...
> [8] Ega23 ©
зя или низя это лучше у accessa спросить... расскажи как зя выполнить два в одном на джете...
logic (2007-01-24 15:49:00) [14]Иногда рекомендуют так:
create procedure ....
insert into/select into ...
select * from [..] where id=SCOPE_IDENTITY() -- с вариантами
Ega23 (2007-01-24 15:37:00) [15]
> Так не отработает. Все запихать в один запрос и сделать
> ему опен (дамс, извращение такое).
>
Только ещё Nocount ON и NoCount OFF добавить
ANB (2007-01-24 15:32:00) [16]
> SQL.Text:='Insert ...
> ExecSQL;
> SQL.Text:='Select @@Identity';
> SQL.Open;
Так не отработает. Все запихать в один запрос и сделать ему опен (дамс, извращение такое).
sniknik (2007-01-24 10:48:00) [17]> и в историю какую-нибудь вставку делать?
а вот это триггерами обычно. ;о)) но никак не логикой программы.
Ega23 (2007-01-24 10:42:00) [18]
> я в процедурах только сложные вещи делаю, простые (типа
> обсуждаемого) в один запрос, так запросами и оставляю.
>
Да ну, вот ещё. А если поcле добавления надо ещё и в историю какую-нибудь вставку делать?
Нафиг-нафиг, всё через хп...
sniknik (2007-01-24 10:35:00) [19]> Почему? Я всё предпочитаю через sp делать.
незнаю... так на уровне подсознания. я в процедурах только сложные вещи делаю, простые (типа обсуждаемого) в один запрос, так запросами и оставляю.
Ega23 (2007-01-24 10:27:00) [20]
> имхо, перебор...
Почему? Я всё предпочитаю через sp делать.