Sdílet prostřednictvím


TN068: Provádění transakcí s ovladačem ODBC Microsoft Access 7

[!POZNÁMKA]

Následující technické poznámce nebyly aktualizovány od byla poprvé zahrnuta v dokumentaci online.Proto některé postupy a témata mohou být nesprávné nebo zastaralé.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í třídami databází MFC ODBC a ovladače Microsoft Access 7.0 ODBC součástí Microsoft ODBC Desktop Driver Pack verze 3.0.

Přehled

Jestliže databáze aplikace provádí transakce, musí být opatrní při volání CDatabase::BeginTrans a CRecordset::Open ve správné posloupnosti v aplikaci.Databázový stroj Microsoft Jet používá ovladač Microsoft Access 7.0 a Jet vyžaduje aplikace není zahájit transakci na jakékoli databázi byl otevřen kurzor.Tříd MFC ODBC databáze, otevřít kurzor rovnat otevření CRecordset objektu.

Pokud otevřete záznamů před voláním do příkazů BeginTrans, nemusí zobrazit žádné chybové zprávy.Všechny sady záznamů umožňuje vaší aplikaci se stanou trvalými po volací aktualizace CRecordset::Update, a aktualizace nebudou vráceny zpět voláním vrácení.Chcete-li se vyhnout tomuto problému, musíte zavolat do příkazů BeginTrans první a otevřít sadu záznamů.

MFC zkontroluje funkce ovladače pro potvrzení a vrácení chování kurzoru.Třída CDatabase obsahuje dvě funkce členů 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 členské SQL_CB_CLOSE protože ovladač aplikace Access nepodporuje zachování kurzoru.Proto musí volat CRecordset::Requery následující CommitTrans nebo vrácení operace.

Pokud potřebujete provést více transakcí za sebou, nelze volat Requery po první transakce a poté spusťte další.Musíte zavřít sady záznamů před další volání do příkazů BeginTrans ke splnění požadavku na Jet.Tato technická Poznámka popisuje dvě metody zpracování této situaci:

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

  • Pomocí funkce rozhraní API ODBC SQLFreeStmt.

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

Před zahájením transakce, ujistěte se, že objektu recordset je uzavřen.Po volání do příkazů BeginTrans, volání sadě záznamů otevřených členské funkce.Zavřete sadu záznamů bezprostředně po volání CommitTrans nebo vrácení.Poznámka: opakovaně otevírání a zavírání záznamů se může zpomalit výkon aplikace.

Pomocí SQLFreeStmt

Můžete také použít funkce rozhraní API ODBC SQLFreeStmt kurzor explicitně zavřete po dokončení transakce.Chcete-li spustit další transakce volání do příkazů BeginTrans a CRecordset::Requery.Při volání SQLFreeStmt, jako první parametr je třeba zadat HSTMT sadě 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 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, můžete volat až po potvrzení spuštění další transakce nebo vrácení první.Chcete-li tyto 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 funkce 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]

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

Viz také

Další zdroje

Technické poznámky podle čísla

Technické poznámky podle kategorie