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

Вниз

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

Наверх




Память: 0.54 MB
Время: 0.053 c
2-1174986425
Sonia
2007-03-27 13:07
2007.04.15
DBCheckBox


2-1174954591
Wood
2007-03-27 04:16
2007.04.15
TRichEdit, свойства текста..


1-1171963386
RJ
2007-02-20 12:23
2007.04.15
указатель на форму


5-1151065835
Артёмич
2006-06-23 16:30
2007.04.15
TreeView передвежение главных item ов вверх, вниз


2-1173705002
Евгений Тарабановский
2007-03-12 16:10
2007.04.15
Как зарегистрировать новый тип файлов в Vista?