Денис писал(а):Andrew Myalin писал(а):Денис писал(а):Вот еще проблема:
У таблицы есть автоинкрементное поле, в словаре ставлю у него Read only.
Так вот если в Init value прописать SELECT @@IDENTITY - все работает, а если Select SCOPE_IDENTITY( ) то нет. В трассе селект отрабатывает но значение поля = 0.
я приведу лишь цитаты большой переписки на эту тему
> А пробовал ли уважаемый получить значение SCOPE_IDENTITY() из Клариона
> после выполнения ADD(File)? Результатом всегда будет 0, полскольку запрос
> будет уже в другом скопе!
Да, так и будет.
ТШ> Все правильно, если использовать IDENT_CURRENT , поскольку он
ТШ> возвращает последний Indentity таблицы во всех сессиях и скопах,
ТШ> чтобы получить, именно то, что нужно, надо использовать
ТШ> Scope_Indentity(), но вот из
ТШ> Клариона это сделать не получится
потому что это надо делать в одном пакете, т е как уже тут говорилось INSERT
засовывать в ХП,
а ХП будет возвращать новое ID через Scope_Identity()
Вопрос исключительно от полного непонимания (незнания?) SQL-технологий.
В частности - алгоритмов работы SQL-сервера. Объясняю на пальцах, как для
второго курса: операция SQL INSERT выполняет только помещение передаваемых
значений в хранилище. Алгоритм следующий:
1. Прочитать значение Identity-поля из системной таблицы и увеличить на
заданное
значение.
2. Присвоить значение Identity-полю и всем Default-полям.
3. Добавить запись.
Все. Никакого перечитывания. Возвращает только ошибку.
Как же выкручиваются все разработчики? Заменой Insert на соответствующую
хранимую процедуру примерно такого типа:
--=======================================
CREATE PROCEDURE DisciplinaInsert
(@Creator int, @IUMU_Dis_code int = NULL, @IDis_Name varchar(500) = NULL)
AS
BEGIN
SET NOCOUNT ON
DECLARE @SID int, @LDateTime datetime
-- Добавляем
INSERT INTO Disciplina (UMU_Dis_code,
Dis_Name,
StartDate,
EndDate)
VALUES(@IUMU_Dis_code,
@IDis_Name,
DEFAULT,
DEFAULT)
IF @@Error = 0
BEGIN
SET @SID = SCOPE_IDENTITY()
RETURN @SID
END
ELSE
RETURN -1
END
--=====================================
Использовать необходимо именно SCOPE_IDENTITY(), а не @@IDENTITY.
Т.к. значение глобальной переменной @@IDENTITY может быть изменено
из другой сессии.