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

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

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

Сообщение 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'а в поле будет сидеть уже правильное значение.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

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

Сообщение Andrew™ »

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

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


Теперь такие ситуации нормально разруливаются.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

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

Сообщение Andrew™ »

Собственно SUBJ, если на таблицу есть триггер, а в триггере есть операции типа UPDATE, это приводило к ошибке выполнения дабавленя, пофиксил.
Персональное спасибо за обнаруженный баг и предоставленный пример с проблемой Андрею Крючкову.
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение 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 РУЛИТ!
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

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

Сообщение Andrew™ »

бросай пример на мыло, поглядим
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

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

Сообщение 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
Ответить