Цієї записці описується виконання операцій під час використання бази даних MFC ODBC класів і Microsoft Access 7.0 ODBC драйвер, включені в пакет драйвер Microsoft ODBC робочого стола версії 3.0.
Огляд
Якщо ваша заявка бази даних виконує операції, ви повинні бути обережні називати CDatabase::BeginTrans і CRecordset::Open у правильній послідовності у вашому додатку. Драйвер Microsoft Access 7.0 використовує Microsoft Jet database engine, і Jet вимагає, що ваша заявка не почати операції на будь-якій базі даних, який має відкриті курсор. Для класів бази даних MFC ODBC відкриті курсор прирівнює до відкритого об'єкта CRecordset.
Якщо відкрити набір записів перед викликом BeginTrans, може не відображатися повідомлення про помилки. Однак, будь-які оновлення набору записів, ваш додаток робить стати постійним після виклику CRecordset::Updateі оновлення буде не відновлено за відкат. Щоб уникнути цієї проблеми, ви повинні спочатку телефонувати BeginTrans і потім відкрити набір записів.
MFC перевіряє курсор commit і відкат поведінки, функція драйвера. Клас CDatabase надає два методи, GetCursorCommitBehavior і GetCursorRollbackBehavior, щоб визначити вплив операції із відкритого об'єкта CRecordset . Microsoft Access 7.0 ODBC драйвера ці методи повернення SQL_CB_CLOSE доступ драйвер підтримує збереження курсор. Таким чином, ви повинні викликати CRecordset::Requery після CommitTrans або скасування операції.
Коли потрібно виконати декілька операцій, один за одним, не можна називати Повторний запит після першої операції а потім почати наступного. Набір записів до наступного виклику BeginTrans для того, щоб задовольнити вимоги Jet, потрібно закрити. Ця технічна Примітка описуються два способи обробки цієї ситуації:
Закриття набір записів після кожного CommitTrans або скасування операції
Перед початком операції переконайтеся, що закриття набору записів об'єкта. Після виклику BeginTrans, дзвінків в recordset відкритим члена. Закрити набір записів відразу після виклику CommitTrans або скасування установки. Зверніть увагу, що неодноразово відкриття і закриття набір записів може уповільнити виконання програми.
За допомогою SQLFreeStmt
Також, за допомогою функції ODBC API SQLFreeStmt явно закрити курсор після завершення транзакції. Щоб почати Інша транзакція, називають BeginTrans , а потім CRecordset::Requery. При дзвінках SQLFreeStmt, необхідно вказати набір записів, HSTMT як перший параметр і SQL_CLOSE як другий параметр. Цей метод є швидше, ніж закрити та відкрити набір записів на початку кожної транзакції. Наступний код показує, як реалізувати цю техніку
CMyDatabase-db;
дБ.Відкрийте ("MYD&ATASOURCE");
CMyRecordset рупій (amp дБ);
/ / Початок операції 1 і / / відкрити набір записів
дБ.BeginTrans ();
RS.(Відкриті);
/ / роботи з даними
/ / кінець операції 1
дБ.CommitTrans (); / / або скасування установки)
/ / close курсор
:: SQLFreeStmt (rs.m_hstmt, SQL_CLOSE);
/ / Початок операції 2
дБ.BeginTrans ();
/ / Тепер отримати наборі результатів
RS.Повторний запит ();
/ / роботи з даними
/ / кінець операції 2
дБ.CommitTrans ();
RS.(Закрити);
дБ.(Закрити)
Інший спосіб, щоб реалізувати цю техніку, це написати нову функцію, RequeryWithBeginTrans, який ви можете назвати для початку наступної транзакції, після того як ви зробити або відкочування перший. Написати таку функцію, виконайте такі дії.:
m_pDatabase->BeginTrans( );Тепер ви можете назвати цю функцію кожної пари угоди:
/ / Початок операції 1 і / / відкрити набір записів
дБ.Begi&nTrans ();
RS.(Відкриті);
/ / роботи з даними
/ / кінець операції 1
дБ.CommitTrans (); nbsp; / / або скасування установки)
/ / Закрити курсор, запуск нової угоди,
/ / і отримати результат
RS.RequeryWithBeginTrans ();
/ / роботи з даними
/ / кінець операції 2
дБ.CommitTrans (); / / або скасування установки)
Примітка Не використовуйте цей метод, щоб змінити набір записів член змінні m_strFilter або m_strSort між угоди. У такому випадку слід закрити набір записів після кожної операції CommitTrans або скасування установки.
Технічні примітки за номером |nbsp; Технічні примітки за категоріями