Имеется MS SQL Server 2000, клиент пишется на Delphi 7. Для доступа к MS SQL используется ADO.
На сервере создаем две таблицы:
CREATE TABLE Table1 (
id int IDENTITY(1,1)PRIMARY KEY,
name varchar(20) NOT NULL)
CREATE TABLE Table2 (
id int IDENTITY(1,1) PRIMARY KEY,
name varchar(20) NULL)
и триггер на вставку записей для таблицы Test1
CREATE TRIGGER Ztrig
ON Table1
FOR INSERT AS
BEGIN
INSERT Table2 VALUES ('test')
END
Создаем форму, помещаем на нее компоненты ADOConnection1, ADODataSet1, DataSource1, DBGrid1.
ADODataSet1.CommandText := 'select id, name from Test1'
После добавления новых строк в ADODataSet1 считывается значение автоинкрементного поля (новое Identity).
Но вместо нового значения id из Table1 возвращается id из Table 2 (срабатывает триггер на вставку записи в Table2),
то есть по умолчанию выполняется команда "select @@identity", которая возвращает значение последнего
автоинкрементного поля в сессии.
Каким образом можно сделать так, чтобы возвращалось значение автоинкрементного поля из Table1 (в T-SQL это
команда "select scope_identity")?
Re: Автоинкрементное поле (Delphi 7, MS SQL 2000, ADO)
Можнл слегка изменить механизм вставки. Для этого используй хранимую процедуру. В её теле будет производится вставка в пуриую табл., получение нового id, вставка во вторую табл. Всё это можно оформить в транзакцию.
... << RSDN@Home 1.1.0 stable >>
Re: Автоинкрементное поле (Delphi 7, MS SQL 2000, ADO)
Здравствуйте, Sergey__, Вы писали:
S__>а чему у тебя равно Update Resync ?
Update Resync по умолчанию равно adResyncAutoIncrement. Если потавить adResyncAll или adResyncAutoIncrement + adResyncInserts , то при добавлении новой записи возникает ошибка, так как движок ADO пытается после добавления строки сразу считать ее значения с сервера и не находит эту запись (как раз из-за того, что в поле id вместо значения из Table1 присутствует id из Table2).