На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> Автоинкрементное поле (Delphi 7, ADO)
    Утро доброе !

    Имеется 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 ?
      лично я все изменения в базе делаю хранимками. в током случае проблемма легко решается:
      [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]
        Так как 11 лет спустя проблема по-прежнему актуальна, дам ссылку на сообщение с решением этой проблемы: http://coding.derkeiler.com/Archive/Delphi...04-05/0109.html
        Один из способов по ссылке - сохранять значение @@IDENTITY на входе в триггер и восстанавливать на выходе:
        ExpandedWrap disabled
           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)
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0247 ]   [ 16 queries used ]   [ Generated: 28.03.24, 19:08 GMT ]