использование 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...
Также не приемлемо и использования хранимых процедур
Заранее спасибо всем ...