Получить новый ID записи после вставки
От: CasperJr  
Дата: 04.12.03 08:43
Оценка:
использование SCOPE_IDENTITY(), @@IDENTITY

Привет всем !!!

Пишу на Vc++ 6.0 под MS SQL 2000:
Даже не знаю, в каком форуме добавить эту тему

Есть первичный ключ с инкрементом.
 try
 {
    // Режим ввода и начало транзакции
    pKernel->m_DataBase.BeginTrans();
    m_pRsMain->AddNew();
    ....
    // Сохранеие данных
    m_pRsMain->Update();

    // Хочу получить новое значение
    // ключа после вставки
    COxRecordset* pSet = new COxRecordset(&pKernel->m_DataBase);
    BOOL bRes = pKernel->OpenRecord(pSet, "SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY], @@IDENTITY AS [@@IDENTITY]", TRUE);
    if (bRes)
    {
       AfxMessageBox("SCOPE_IDENTITY = " + pSet->Field(0).AsString() + 
        ",\n@@IDENTITY = " + pSet->Field(1).AsString());
    }
    if (pSet->IsOpen()) pSet->Close();
    delete pSet;

    //  Закрытие транзакции
    pKernel->m_DataBase.CommitTrans();
    // Результат
    bRes = TRUE;
 }
 catch (CDBException* e)
 {
   pKernel->m_DataBase.Rollback();
   AfxMessageBox(FormatER(IDS_ERROR4, e->m_strError));
   e->Delete();
 }


pKernel — мой класс для работы с БД. OXRecordset -> наследник CRecordset
На таблицу навешан триггер, который делает еще вствку в другую таблицу.
Все просто..
Но почему-то @@IDENTITY показывает правильно, а SCOPE_IDENTITY
возвращает NULL. Причем не зависит от типа открытия recordset
(dynaset, snapshot ..).
Читал BOL, подозрение на текущую сессию, но ведь я работаю в
текущей сессии ?

Кто сталкивался с такой проблемой ? Help me ..

Да, вариант MoveLast() после Update() для получения нового
значения первичного ключа не подходит, т.к. он работатет
только для dynaset...
Также не приемлемо и использования хранимых процедур

Заранее спасибо всем ...
Re: Получить новый ID записи после вставки
От: Fib  
Дата: 04.12.03 08:51
Оценка:
я решил проблему с IDENTITY так:
— добавил в таблицу поле типа uniqueidentifier
— при Insert вставляешь GUID, сгенерированную в твоей проге
— делаешь выборку по этому идентификатору и берешь ID

может быть, слишком много "движений", зато работает без проблем.
Re[2]: Получить новый ID записи после вставки
От: CasperJr  
Дата: 04.12.03 09:26
Оценка:
Здравствуйте, Fib, Вы писали:

Fib>я решил проблему с IDENTITY так:

Fib>- добавил в таблицу поле типа uniqueidentifier
Fib>- при Insert вставляешь GUID, сгенерированную в твоей проге
Fib>- делаешь выборку по этому идентификатору и берешь ID

Fib>может быть, слишком много "движений", зато работает без проблем.


Спасибо за ответ..
Оргигинальное решение !!!

Но для меня слишком громоздко.. Есть документ с ID -> есть подчиненные документы со
своими ID -> есть у подчиненных документов свои подчиненные документы со
своими ID и т.д.. И для каждого генерировать GUID...плохо
Re[2]: Получить новый ID записи после вставки
От: Serguei666 Беларусь  
Дата: 04.12.03 18:50
Оценка:
Здравствуйте, Fib, Вы писали:

Fib>я решил проблему с IDENTITY так:

Fib>- добавил в таблицу поле типа uniqueidentifier
Добавление временного поля — очень плохое решение.

Fib>- при Insert вставляешь GUID, сгенерированную в твоей проге

Fib>- делаешь выборку по этому идентификатору и берешь ID
Можно просто искать запись в которой ID максимальный.
Хотите сказать 'спасибо'? Тогда поставьте оценку
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.