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 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 BeginTransotevř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 operaci Rollback

  • Použití funkce SQLFreeStmtrozhraní 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í BeginTransvolejte č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í SQLFreeStmtje 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, RequeryWithBeginTranskterou 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:

  1. Zkopírujte kód pro CRecordset::Requery( ) novou funkci.

  2. 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í