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