Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 @@identity=NULL  [new]
Mik Prokoshin
Member

Откуда: Барнаул
Сообщений: 1240
@@IDENTITY по BOL работает в текущей сессии. Я после вставки записи через TADODataset (Delphi) делаю TADOCommand, в ней вызываю функцию GetIdentity, в ней : RETURN @@IDENTITY.
Получаю NULL, вместо последнего введенного IDENTITY. Почему бы это ??
Коннекшн тот же, (всегда активен), да и проверил - никак он не изменился.
Неужели @@IDENTITY все же к Scope привязано, или сессия может измениться ?
22 авг 03, 12:29    [311301]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А какой сервер?
22 авг 03, 12:34    [311314]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
Mik Prokoshin
Member

Откуда: Барнаул
Сообщений: 1240
MSDE 2k
22 авг 03, 12:41    [311340]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Попробуй воспользоваться IDENT_CURRENT, но с ней можешь промахнуться при многопользовательской работе.
22 авг 03, 12:49    [311349]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Надо посмотреть, а нет ли триггера на инсерт, который вставляет записи в другую таблицу запись, одно из полей которой имеет свойство IDENTITY.
22 авг 03, 13:00    [311387]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
Mik Prokoshin
Member

Откуда: Барнаул
Сообщений: 1240
MSDE2k SP3
Попробовал через TADOQuery :
SET :val=@@IDENTITY
возвращает NULL
SET :val=IDENT_CURRENT('MyTable')
работает на ура, но ... не хочется - тогда еще блокировки дополнительные придется ставить, а вдруг ручками в базу полезут вводить...
Триггеров нет.
Перечитал еще раз:
BOL:
IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope.
@@IDENTITY returns the last identity value generated for any table in the current session, across all scopes.
SCOPE_IDENTITY returns the last identity value generated for any table in the current session and the current scope.

В чем может быть проблема с @@IDENTITY ?
22 авг 03, 13:20    [311431]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
UnknownMember
Guest
Я надеюсь, у TADODataset и у TADOCommand свойство Connection указывает на один и тот же экземпляр TADOConnection.

???
22 авг 03, 13:30    [311451]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
Mik Prokoshin
Member

Откуда: Барнаул
Сообщений: 1240
Ясно дело... Я наследую компонент от TADODataset, в методе Post :
DisableControls; //Для чистоты эксперимента
inherited;
q:=TADOQuery.Create(Self);
q.Connection:=Connection;
q.Parameters.CreateParameter('val',ftInteger,pdReturnValue,4,0);
q.SQL.Add('SET :val = @@IDENTITY');
q.ExecSQL;
tmp:=q.Parameters.ParamByName('val').Value;
...

Я уже думаю о том, что возможно, после INSERT где-то на уровне АДО или VCL компонентах проходит SELECT и тогда @@IDENTITY обнуляется... Или оно не должно при этом обнуляться ?
22 авг 03, 13:38    [311473]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
UnknownMember
Guest
А если заменить последние 3 строки, а 4 снизу удалить:


q.SQL.Add('SELECT @@IDENTITY val');
q.ExecSQL;
tmp:=q.FieldByName('val').AsInteger;
22 авг 03, 13:57    [311509]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
Mik Prokoshin
Member

Откуда: Барнаул
Сообщений: 1240
Ошибка так "Item cannot be found..."
Не, с передачей данных все в порядке
q.SQL.Add('SET :val=IDENT_CURRENT(''MyTable'')');
ставим и работает как надо. Но непонятно...
22 авг 03, 15:18    [311744]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Картина, в общем-то понятна. Коннект занят недофетченной выборкой, а в этом случае ADO для нового запроса откроет автоматом новую временную сессию. В ней-то и получается @@IDENTITY=NULL, так как в этой сессии еще не было ни одной вставки.

Как правило, такое происходит при использовании серверных курсоров.
22 авг 03, 18:37    [312201]     Ответить | Цитировать Сообщить модератору
 Re: @@identity=NULL  [new]
Mik Prokoshin
Member

Откуда: Барнаул
Сообщений: 1240
2Dankov: Вы были совершенно правы ! Из-за серверных курсоров у АДО съезжает напрочь крыша и даже при обычном датасете вида 'SELECT * FROM MyTable', генерируемые OLEDB INSERT и последующий SELECT @@IDENTITY (а тем более, когда я пытался отдельно получить IDENTITY) - получаются в разных сессиях. Отказ от серверных курсоров все нормализовал. Спасибо.
(четыре дня копался, нет бы сразу задуматься над Вашим советом ! Сначала с UPDATE RESYNC экспериментировал, потом выяснил профайлером, что разные сессии, стал искать, почему OTHERS' INSERTS VISIBLE не работает (похоже, не поддерживается SQLOLEDB провайдером), потом как число сессий ограничивать, это, похоже, через АДО невозможно, а уже потом повнимательнее посмотрел на логи и увидел, что один из dataset на форме установлен в UseServer) :-)
Как в анекдоте про 100 рублей за один удар молотком. За то, что знал куда ударить !
26 авг 03, 14:49    [315398]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить