Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.112.1] |
|
Сообщ.
#1
,
|
|
|
Утро доброе !
Имеется 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 ? |
Сообщ.
#2
,
|
|
|
лично я все изменения в базе делаю хранимками. в током случае проблемма легко решается:
[sql]CREATE PROCEDURE [sp_In] (@A [varchar], @ID [INT] [OUTPUT]) AS INSERT INTO Table1 ( [A]) VALUES ( @A) SET @ID = @@IDENTITY INSERT INTO Table2 ( [A]) VALUES ( @A) [/sql] |
Сообщ.
#3
,
|
|
|
Так как 11 лет спустя проблема по-прежнему актуальна, дам ссылку на сообщение с решением этой проблемы: http://coding.derkeiler.com/Archive/Delphi...04-05/0109.html
Один из способов по ссылке - сохранять значение @@IDENTITY на входе в триггер и восстанавливать на выходе: DECLARE @example TABLE (ii INT IDENTITY (5,23)) INSERT @example DEFAULT VALUES PRINT 'Initial Identity = '+CAST(@@IDENTITY AS VARCHAR) -- START OF IDENTITY BACKUP DECLARE @BackupIdentitySeederFunc VARCHAR(1000) SET @BackupIdentitySeederFunc = 'DECLARE @BackupIdentity TABLE (IdentityID INT IDENTITY('+CAST(@@IDENTITY AS VARCHAR)+', 1)) INSERT @BackupIdentity DEFAULT VALUES' -- END OF IDENTITY BACKUP INSERT @example DEFAULT VALUES PRINT 'New Identity = '+CAST(@@IDENTITY AS VARCHAR) INSERT @example DEFAULT VALUES PRINT 'Another New Identity = '+CAST(@@IDENTITY AS VARCHAR) -- RETRIEVE ORIGINAL IDENTITY EXEC (@BackupIdentitySeederFunc) PRINT 'Back to Original Identity = '+CAST(@@IDENTITY AS VARCHAR) |