TN068: Provádění transakcí pomocí ovladače ODBC Microsoft Access 7
Poznámka
Následující technická poznámka se od prvního zahrnutí do online dokumentace neaktualizovala. V důsledku toho můžou být některé postupy a témata zastaralé nebo nesprávné. Nejnovější informace doporučujeme vyhledat v online indexu dokumentace, které vás zajímá.
Tato poznámka popisuje, jak provádět transakce při použití databázových tříd MFC ODBC a ovladače ODBC aplikace Microsoft Access 7.0, který je součástí sady Microsoft ODBC Desktop Driver Pack verze 3.0.
Přehled
Pokud vaše databázová aplikace provádí transakce, musíte být opatrní při volání CDatabase::BeginTrans
a CRecordset::Open
ve správném pořadí v aplikaci. Ovladač Microsoft Accessu 7.0 používá databázový stroj Microsoft Jet a Jet vyžaduje, aby aplikace nespustí transakci u žádné databáze, která má otevřený kurzor. U databázových tříd MFC ODBC se otevřený kurzor rovná otevřenému CRecordset
objektu.
Pokud před voláním BeginTrans
otevřete sadu záznamů, nemusí se zobrazit žádné chybové zprávy. Všechny aktualizace sady záznamů, které vaše aplikace provede po volání CRecordset::Update
, se však stanou trvalými a aktualizace nebudou vráceny voláním Rollback
. Chcete-li se tomuto problému vyhnout, musíte nejprve zavolat BeginTrans
a pak otevřít sadu záznamů.
MFC kontroluje funkčnost ovladače pro potvrzení kurzoru a chování vrácení zpět. Třída CDatabase
poskytuje dvě členské funkce GetCursorCommitBehavior
a GetCursorRollbackBehavior
, určit účinek jakékoli transakce na otevřený CRecordset
objekt. U ovladače ODBC aplikace Microsoft Access 7.0 tyto členské funkce vrátí, SQL_CB_CLOSE
protože ovladač aplikace Access nepodporuje zachování kurzoru. Proto je nutné volat CRecordset::Requery
následující CommitTrans
operaci.Rollback
Pokud potřebujete provést více transakcí po druhé, nemůžete zavolat Requery
po první transakci a pak spustit další. Před dalším voláním BeginTrans
je nutné sadu záznamů zavřít, aby vyhovovala požadavku Jet. Tato technická poznámka popisuje dvě metody zpracování této situace:
Zavření sady záznamů po každé
CommitTrans
operaciRollback
Použití funkce
SQLFreeStmt
rozhraní ODBC API .
Zavření sady záznamů po každé operaci CommitTrans nebo Rollback
Před zahájením transakce se ujistěte, že je objekt sady záznamů zavřený. Po volání BeginTrans
volejte členskou Open
funkci sady záznamů. Ukončete sadu záznamů ihned po volání CommitTrans
nebo Rollback
. Mějte na paměti, že opakované otevírání a zavírání sady záznamů může zpomalit výkon aplikace.
Použití SQLFreeStmt
Pomocí funkce SQLFreeStmt
rozhraní ODBC API můžete také explicitně zavřít kurzor po ukončení transakce. Chcete-li zahájit další transakci, volání BeginTrans
následované CRecordset::Requery
. Při volání SQLFreeStmt
je nutné zadat HSTMT sady záznamů jako první parametr a SQL_CLOSE jako druhý parametr. Tato metoda je rychlejší než uzavření a otevření sady záznamů na začátku každé transakce. Následující kód ukazuje, jak implementovat tuto techniku:
CMyDatabase db;
db.Open("MYDATASOURCE");
CMyRecordset rs(&db);
// start transaction 1 and
// open the recordset
db.BeginTrans();
rs.Open();
// manipulate data
// end transaction 1
db.CommitTrans(); // or Rollback()
// close the cursor
::SQLFreeStmt(rs.m_hstmt, SQL_CLOSE);
// start transaction 2
db.BeginTrans();
// now get the result set
rs.Requery();
// manipulate data
// end transaction 2
db.CommitTrans();
rs.Close();
db.Close();
Dalším způsobem implementace této techniky je napsat novou funkci, RequeryWithBeginTrans
kterou můžete volat, aby se další transakce spustila po potvrzení nebo vrácení zpět první. Pokud chcete takovou funkci napsat, proveďte následující kroky:
Zkopírujte kód pro
CRecordset::Requery( )
novou funkci.Přidejte následující řádek bezprostředně za volání:
SQLFreeStmt
m_pDatabase->BeginTrans( );
Teď můžete tuto funkci volat mezi jednotlivými páry transakcí:
// start transaction 1 and
// open the recordset
db.BeginTrans();
rs.Open();
// manipulate data
// end transaction 1
db.CommitTrans(); // or Rollback()
// close the cursor, start new transaction,
// and get the result set
rs.RequeryWithBeginTrans();
// manipulate data
// end transaction 2
db.CommitTrans(); // or Rollback()
Poznámka
Tuto techniku nepoužívejte, pokud potřebujete změnit členské proměnné sady záznamů m_strFilter nebo m_strSort mezi transakcemi. V takovém případě byste měli sadu záznamů po každé CommitTrans
operaci zavřít Rollback
.
Viz také
Technické poznámky podle čísel
Technické poznámky podle kategorií