Udostępnij za pośrednictwem


TN068: Wykonywanie transakcji ze sterownika ODBC Microsoft Access 7

[!UWAGA]

Następujące Uwaga techniczna została zaktualizowana, ponieważ najpierw została uwzględniona w dokumentacji online.W rezultacie niektóre procedur i tematów może być nieaktualne lub nieprawidłowe.Najnowsze informacje zaleca się wyszukać temat zainteresowanie Indeks dokumentacji online.

Uwaga Ta opisano sposób wykonywania transakcji, podczas używania klas MFC ODBC bazy danych i sterownik ODBC programu Microsoft Access 7.0 uwzględnione w wersji 3.0 programu Microsoft ODBC Desktop Driver Pack.

Omówienie

Jeśli transakcje są wykonywane w aplikacji bazy danych, należy zachować ostrożność, aby zadzwonić do CDatabase::BeginTrans i CRecordset::Open w prawidłowej kolejności w aplikacji.Sterownik Microsoft Access 7.0 używa aparatu bazy danych Microsoft Jet i Jet wymaga się, że aplikacja nie rozpoczyna transakcję na dowolnej bazy danych zawierającej otwarte kursora.Dla klas bazy danych MFC ODBC otwartych kursorów równa otwartego CRecordset obiektu.

Jeśli otworzysz rekordów przed wywoływaniem BeginTrans, nie może wyświetlić komunikaty o błędach.Jednak żadnych rekordów aktualizuje swoje aplikacji powoduje, że stają się stałe po wywołaniu CRecordset::Update, a aktualizacje nie wycofuje przez wywołanie wycofywania.Aby uniknąć tego problemu, należy wywołać BeginTrans pierwszy, a następnie otwórz zestaw rekordów.

MFC sprawdza funkcjonalność sterownika dla zachowania i wycofywania kursora.Klasa CDatabase zawiera dwie funkcje składowe, GetCursorCommitBehavior i GetCursorRollbackBehavior, aby ustalić wpływ wszelkich transakcji na Twoje Otwórz CRecordset obiektu.Sterownik ODBC programu Microsoft Access 7.0 funkcje Członkowskie zwracają SQL_CB_CLOSE , ponieważ sterownik programu Access nie obsługuje kursora konserwacji.Dlatego należy wywołać CRecordset::Requery następujące CommitTrans lub wycofywania operacji.

Gdy konieczne jest wykonanie wielu transakcji, jeden po drugim, nie można wywołać funkcji Requery po pierwszej transakcji, a następnie rozpoczęcia następnego.Należy zamknąć rekordów przed kolejnym wywołaniu BeginTrans w celu spełnienia wymogu Jet.Ten Uwaga techniczna opisano dwie metody obsługi tej sytuacji:

  • Zamknięcie zestawu rekordów po każdym CommitTrans lub wycofywania operacji.

  • Za pomocą funkcji interfejsu API ODBC SQLFreeStmt.

Zamknięcie zestawu rekordów po każdym CommitTrans lub operacji wycofywania

Przed rozpoczęciem transakcji, upewnij się, że obiekt recordset jest zamknięty.Po wywołaniu BeginTrans, wywołanie w zestawie rekordów Otwórz funkcji składowej.Zamknąć zestaw rekordów natychmiast po wywołaniu CommitTrans lub wycofywania.Należy zauważyć, że wielokrotne otwieranie i zamykanie zestaw rekordów może zmniejszyć wydajność aplikacji.

Przy użyciu SQLFreeStmt

Można również użyć funkcji interfejsu API ODBC SQLFreeStmt jawnego zamknięcia kursor po zakończenia transakcji.Aby uruchomić inną transakcję, należy wywołać BeginTrans po CRecordset::Requery.Podczas wywoływania SQLFreeStmt, należy określić HSTMT rekordów jako pierwszy parametr i SQL_CLOSE jako drugi parametr.Metoda ta jest szybsza niż zamknięcia i otwarcia zestawu rekordów na początku każdej transakcji.Poniższy kod ilustruje sposób implementacji tej techniki:

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 pisanie nowych funkcji, RequeryWithBeginTrans, które można wywołać, aby rozpocząć następnej transakcji, po zatwierdzeniu lub wycofywania pierwszego.Do zapisu takich funkcji, wykonaj następujące kroki:

  1. Skopiuj kod (CRecordset::Requery) do nowych funkcji.

  2. Dodaj następujący wiersz natychmiast po wywołaniu SQLFreeStmt:

    m_pDatabase->BeginTrans( );

Teraz może wywołać 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]

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

Zobacz też

Inne zasoby

Uwagi techniczne przez liczbę

Uwagi techniczne według kategorii