Страница 1 из 1

MS SQL сервер и IDENTITY поля

Добавлено: 07 Март 2006, 11:05
Andrew™
Всем привет

Очень много обсуждался вопрос правильного использования IDENTITY полей

правильное решение получения значения такого поля после добавления это:

Код: Выделить всё

SELECT SCOPE_IDENTITY()
но добавление INSERT и получение SELECT должны быть в одном скопе

что означало, что добавлять записи надо в ХП, что на мой взгляд крайне
неудобно, т к надо постоянно следить за такими ХП при изменении струткуры
таблицы.

оказывается можно проще без ХП:

Код: Выделить всё

11803608 Maximum read 1 rows for cursor
Binding field 1  = bbb
Binding field 2  = 5
11803608 Parsing Cursor : INSERT INTO dbo.TEST_Table ("Field2","Field3") 
VALUES(?,?) SELECT SCOPE_IDENTITY()
11803608 Fetch cursor (1)
 = 47
применительно к MAV Direct ODBC, для такого поля в DCT включается крыжик
ReadOnly, а в качестве Initail Value прописывается SELECT SCOPE_IDENTITY(),
и всё, после MAVINSERT'а в поле будет сидеть уже правильное значение.

Не отлавливалась ошибка при добавлении

Добавлено: 16 Март 2006, 12:21
Andrew™
выяснилось, что если INSERT возвращает ошибку, то след в том же скопе SELECT SCOPE_IDENTITY() её cбрасывал и библиотека считала, что запись удачно добавилась, а в File.IdentityField попадал НУЛЬ

ну и дальше начинался бардак в программе, при попвтке удалить щзапись из Browse - ошибка Record Not Found и т д.


Теперь такие ситуации нормально разруливаются.

Вычислили баг при работе с IDENTITY

Добавлено: 07 Июль 2006, 9:09
Andrew™
Собственно SUBJ, если на таблицу есть триггер, а в триггере есть операции типа UPDATE, это приводило к ошибке выполнения дабавленя, пофиксил.
Персональное спасибо за обнаруженный баг и предоставленный пример с проблемой Андрею Крючкову.

Re: Не отлавливалась ошибка при добавлении

Добавлено: 10 Август 2006, 9:19
Admin
выяснилось, что если INSERT возвращает ошибку, то след в том же скопе SELECT SCOPE_IDENTITY() её cбрасывал и библиотека считала, что запись удачно добавилась, а в File.IdentityField попадал НУЛЬ
ну и дальше начинался бардак в программе, при попвтке удалить щзапись из Browse - ошибка Record Not Found и т д.
У меня примерно такая же ситуация сейчас. После MAVINSERT (с использованием в таблице SELECT SCOPE_IDENTITY()) выдается ошибка, хотя запись реально в таблицу добавляется.
Делал и руками (я про тот класс что вчера рассказывал) и Browse-Form стандартные делал. Результат одинаковый!

P.S. Андрей! Если у тебя есть список рассылки для пользователей купивших MAV включи меня туда пожалуйста ... а то после каждого твоего билда нужно у тебя ссылку персонально просить :)

P.P.S. Все что ты мне вчера объяснил, я реализовал. Вывод -> MAV РУЛИТ!

Re: Не отлавливалась ошибка при добавлении

Добавлено: 10 Август 2006, 14:24
Andrew™
бросай пример на мыло, поглядим

Re: Не отлавливалась ошибка при добавлении

Добавлено: 10 Август 2006, 15:14
Andrew™
м-да, была бяка, теперь всё чисто

Код: Выделить всё

6822176 Maximum read 1 rows for cursor
Binding field 1 "ProgramName" = DemoProgramm
6822176 Parsing Cursor : SELECT "ProgramName","ID" FROM xa_programs WHERE "ProgramName"=?
6822176 Fetch cursor (1)
ERROR : Record Not Found [35]
6822176 Close cursor
6822176 Free cursor
Begin transaction  Return Code : 0
6822176 Open cursor
6822176 Maximum read 1 rows for cursor
Binding field 1  = DemoProgramm
6822176 Parsing Cursor : INSERT INTO xa_programs ("ProgramName") VALUES(?) SELECT SCOPE_IDENTITY()
6822176 Fetch cursor (1)
 = 6
6822176 Close cursor
6822176 Free cursor
Commit transaction  Return Code : 0