Sdílet prostřednictvím


TN068: Provádění transakcí pomocí ovladače ODBC Microsoft Access 7

[!POZNÁMKA]

Následující technická poznámka nebyla aktualizována, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být nesprávné nebo zastaralé.Pro nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.

Tato poznámka popisuje, jak provádět transakce při použití databázové třídy knihovny MFC rozhraní ODBC a ovladače Microsoft Access 7.0 ODBC, součástí Microsoft ODBC Desktop Driver Pack verze 3.0.

Přehled

Pokud databázové aplikace uskutečňuje transakce, musíte být opatrní při volání CDatabase::BeginTrans a CRecordset::Open ve správném pořadí ve vaší aplikaci.Databázový stroj Microsoft Jet používá ovladač Microsoft Access 7.0 a Jet vyžaduje vaše aplikace není začít transakce v databázi otevřít kurzor.Pro databázové třídy knihovny MFC rozhraní ODBC, otevřené kurzor je otevřený CRecordset objektu.

Je-li otevřít sadu záznamů před volací BeginTrans, nemusí se zobrazit chybové zprávy.Však všechny sady záznamů aktualizuje vaše aplikace umožňuje trvalý po volání CRecordset::Update, a aktualizace nebudou vráceny zpět voláním vrácení.Chcete-li se tomuto problému vyhnout, musí volat BeginTrans první a potom otevřete sadu záznamů.

MFC zkontroluje funkčnost ovladače pro potvrzení a vrácení zpět chování kurzoru.Třída CDatabase nabízí dvě členské funkce GetCursorCommitBehavior a GetCursorRollbackBehavior, určit účinek všech transakcí při otevření vaší CRecordset objektu.Ovladače Microsoft Access 7.0 ODBC, vrátí tyto funkce člen SQL_CB_CLOSE vzhledem k tomu, že ovladač aplikace Access nepodporuje zachování kurzor.Proto musí volat CRecordset::Requery následující CommitTrans nebo vrácení operace.

Pokud je třeba provést více transakcí za sebou, nelze volat Requery po první transakci a poté spusťte druhý.Je třeba zavřít sadu záznamů před další volání BeginTrans s cílem splnit požadavek na Jet.Tato technická Poznámka popisuje dvě metody zpracování této situaci:

  • Uzavření sady záznamů po každé CommitTrans nebo vrácení operace.

  • Pomocí funkce rozhraní ODBC API SQLFreeStmt.

Po každé CommitTrans nebo Rollback operace uzavření sady záznamů

Před spuštěním transakce, zkontrolujte, zda že objekt sady záznamů je uzavřen.Po volání BeginTrans, sady záznamů voláním otevřených členské funkce.Zavřít sadu záznamů, ihned po volání CommitTrans nebo vrácení.Poznámka: opakované otevírání a zavírání sady záznamů se může snížit výkon aplikace.

Pomocí SQLFreeStmt

Můžete také použít funkce rozhraní ODBC API SQLFreeStmt explicitně kurzor zavřete po dokončení transakce.Chcete-li spustit jinou transakcí, zavolejte BeginTrans a CRecordset::Requery.Při volání SQLFreeStmt, je nutné zadat jako první parametr HSTMT sady záznamů 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 tento postup:

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, můžete volat spustit další transakci po potvrzení nebo rollback první.Napsat takové funkce, proveďte následující kroky:

  1. Zkopírujte kód pro (CRecordset::Requery) nové funkce.

  2. Přidejte následující řádek ihned po volání SQLFreeStmt:

    m_pDatabase->BeginTrans( );

Nyní můžete volat tuto funkci mezi každou dvojicí 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]

Nepoužívejte tuto techniku, pokud potřebujete změnit sady záznamů členské proměnné m_strFilter nebo m_strSort mezi transakcemi.V takovém případě by měly zavřít sadu záznamů, po každé CommitTrans nebo vrácení operace.

Viz také

Další zdroje

Technické poznámky podle čísel

Technické poznámky podle kategorií