Udostępnij za pośrednictwem


TN068: wykonywanie transakcji za pomocą sterownika Microsoft Access 7 ODBC

Uwaga / Notatka

Następująca uwaga techniczna nie została zaktualizowana, ponieważ została po raz pierwszy uwzględniona w dokumentacji online. W związku z tym niektóre procedury i tematy mogą być nieaktualne lub nieprawidłowe. Aby uzyskać najnowsze informacje, zaleca się wyszukanie interesującego tematu w indeksie dokumentacji online.

W tej notatce opisano sposób wykonywania transakcji w przypadku używania klas baz danych MFC ODBC i sterownika Microsoft Access 7.0 ODBC zawartego w pakiecie Sterowników klasycznych ODBC firmy Microsoft w wersji 3.0.

Przegląd

Jeśli aplikacja bazy danych wykonuje transakcje, należy zwrócić uwagę na wywołanie CDatabase::BeginTrans i CRecordset::Open w odpowiedniej kolejności w aplikacji. Sterownik programu Microsoft Access 7.0 używa aparatu bazy danych Microsoft Jet, a narzędzie Jet wymaga, aby aplikacja nie rozpoczynała transakcji w żadnej bazie danych, która ma otwarty kursor. W przypadku klas baz danych MFC ODBC otwarty kursor odpowiada otwartemu CRecordset obiektowi.

Jeśli otworzysz zestaw rekordów przed wywołaniem BeginTransmetody , może nie zostać wyświetlony żaden komunikat o błędach. Jednak wszystkie aktualizacje zestawu rekordów, które wykona aplikacja, stają się trwałe po wywołaniu CRecordset::Update, a aktualizacje nie zostaną wycofane przez wywołanie Rollback. Aby uniknąć tego problemu, należy najpierw wywołać BeginTrans metodę , a następnie otworzyć zestaw rekordów.

MFC sprawdza funkcjonalność sterownika w zakresie zachowania podczas zatwierdzenia i wycofania kursora. Klasa CDatabase udostępnia dwie funkcje składowe, GetCursorCommitBehavior i GetCursorRollbackBehavior, które służą do określenia wpływu dowolnej transakcji na Twój otwarty obiekt CRecordset. W przypadku sterownika ODBC programu Microsoft Access 7.0 te funkcje członkowskie zwracają SQL_CB_CLOSE , ponieważ sterownik programu Access nie obsługuje zachowywania kursora. W związku z tym należy wywołać CRecordset::Requery po operacji CommitTrans lub Rollback.

Jeśli musisz wykonać wiele transakcji po drugiej, nie można wywołać Requery po pierwszej transakcji, a następnie uruchomić następne. Musisz zamknąć zestaw rekordów przed następnym wywołaniem BeginTrans, aby spełnić wymóg systemu Jet. Ta uwaga techniczna opisuje dwie metody obsługi tej sytuacji:

  • Zamykanie zestawu rekordów po każdej operacji CommitTrans lub Rollback.

  • Za pomocą funkcji SQLFreeStmt interfejsu API ODBC.

Zamykanie zestawu rekordów po każdej operacji CommitTrans lub operacji Rollback.

Przed rozpoczęciem transakcji upewnij się, że obiekt zestawu rekordów jest zamknięty. Po wywołaniu metody BeginTranswywołaj funkcję składową Open zestawu rekordów. Zamknij zestaw rekordów natychmiast po wywołaniu metody CommitTrans lub Rollback. Należy pamiętać, że wielokrotne otwieranie i zamykanie zestawu rekordów może spowolnić wydajność aplikacji.

Korzystanie z narzędzia SQLFreeStmt

Możesz również użyć funkcji SQLFreeStmt interfejsu API ODBC, aby jawnie zamknąć kursor po zakończeniu transakcji. Aby rozpocząć kolejną transakcję, najpierw wywołaj BeginTrans, a następnie CRecordset::Requery. Podczas wywoływania SQLFreeStmt, należy określić HSTMT zestawu rekordów jako pierwszy parametr, a SQL_CLOSE jako drugi parametr. Ta metoda jest szybsza niż zamykanie i otwieranie zestawu rekordów na początku każdej transakcji. Poniższy kod pokazuje, jak zaimplementować tę technikę:

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();

Innym sposobem zaimplementowania tej techniki jest napisanie nowej funkcji , RequeryWithBeginTransktórą można wywołać w celu uruchomienia następnej transakcji po zatwierdzeniu lub wycofaniu pierwszego. Aby napisać taką funkcję, wykonaj następujące czynności:

  1. Skopiuj kod dla CRecordset::Requery( ) do nowej funkcji.

  2. Dodaj następujący wiersz bezpośrednio po wywołaniu metody SQLFreeStmt:

    m_pDatabase->BeginTrans( );

Teraz możesz wywołać tę funkcję między każdą parą transakcji:

// 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()

Uwaga / Notatka

Nie należy używać tej techniki, jeśli musisz zmienić zmienne składowe zestawu rekordów m_strFilter lub m_strSort między transakcjami. W takim przypadku należy zamknąć zestaw rekordów po każdej operacji CommitTrans lub Rollback.

Zobacz także

Uwagi techniczne według numeru
Uwagi techniczne według kategorii