Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.52 MB
Время: 0.069 c
15-1174386860
Игорь М.
2007-03-20 13:34
2007.04.15
Разрешённые сайты для посещения...


15-1174384301
Сало
2007-03-20 12:51
2007.04.15
Шева вернулся


1-1172067206
sia
2007-02-21 17:13
2007.04.15
что находится под курсором мыши?


15-1172823552
Игорь Шевченко
2007-03-02 11:19
2007.04.15
Компания CodeGear Borland приглашает на семинары


3-1169559474
Petrovsky
2007-01-23 16:37
2007.04.15
Странная ошибка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский