Uwaga ta opisuje sposób przeprowadzenia transakcji, korzystając z klasami baz danych MFC ODBC i sterownik ODBC programu Microsoft Access 7.0 włączone do wersji Microsoft ODBC Desktop Driver Pack 3.0.
Przegląd
Jeżeli aplikacji bazy danych przeprowadza transakcje, należy uważać, aby wywołać CDatabase::BeginTrans i CRecordset::Open w prawidłowej kolejności w aplikacji. Sterownik Microsoft Access 7.0 używa aparatu bazy danych Microsoft Jet, a Jet wymaga, że aplikacja nie rozpoczyna transakcję na dowolnej bazy danych, który został otwarty kursora. Dla klas MFC ODBC bazy danych otwartej kursor równa Otwórz obiekt CRecordset.
Jeśli otworzysz zestaw rekordów przed wywołaniem metody BeginTransmogą nie Zobacz komunikaty o błędach. Jednakże wszelkie aktualizacje zestaw rekordów, który aplikacji sprawia, że stają się stałe po wywołaniu CRecordset::Update, a aktualizacje nie identyfikator_transakcji wycofuje wywołując wycofywania. Aby uniknąć tego problemu, należy najpierw wywołać BeginTrans , a następnie otwórz zestaw rekordów.
MFC sprawdza funkcjonalność sterownika dla przekazywania i wycofywania zachowanie kursora. Klasa CDatabase udostępnia dwie funkcje składowe, GetCursorCommitBehavior i GetCursorRollbackBehavior, aby określić wpływ każdej transakcji otwartego obiektu CRecordset . Sterownik ODBC programu Microsoft Access 7.0 te funkcje składowe zwrotu SQL_CB_CLOSE , ponieważ sterownik dostępu nie obsługuje kursora konserwacji. W związku z tym należy wywołać CRecordset::Requery po CommitTrans lub wycofywania operacji.
Gdy trzeba wykonać wiele transakcji, jeden po drugim, nie można wywołać PonówKwerendę po pierwszej transakcji, a następnie uruchom następnego. Musisz zamknąć rekordów przed kolejnym wywołaniu BeginTrans w celu spełnienia wymogu Jet. Ta Uwaga techniczna opisano dwie metody obsługi tej sytuacji:
Zamknięcie zestawu rekordów po każdym CommitTrans lub operacja wycofywania
Przed rozpoczęciem transakcji, upewnij się, że obiekt recordset jest zamknięty. Po wywołaniu BeginTrans, wywołanie funkcji członek Open w zestawie rekordów. Zamknąć zestaw rekordów natychmiast po wywołaniu CommitTrans lub wycofywania. Należy zauważyć, że wielokrotnie otwierającym i zamykającym rekordów może zmniejszyć wydajność aplikacji.
Przy użyciu SQLFreeStmt
Za pomocą funkcji interfejsu API ODBC SQLFreeStmt można również wyraźnie zamknąć kursor po zakończenia transakcji. Aby uruchomić inną transakcję, wywołanie BeginTrans po CRecordset::Requery. Podczas wywoływania SQLFreeStmt, należy określić w zestawie rekordów HSTMT, jako pierwszy parametr i SQL_CLOSE jako drugi parametr. Metoda ta jest szybsza niż zamknięcia i otwarcia rekordów na początku każdej transakcji. Poniższy kod ilustruje sposób wdrożenia tej techniki
CMyDatabase db;
DB.Otwórz ("MYD&ATASOURCE");
R CMyRecordset (amp; db);
/ / start transakcji 1 i / / Otwórz zestaw rekordów
DB.BeginTrans ();
r.(Otwórz);
/ / manipulowania danymi
/ / zakończenia transakcji 1
DB.CommitTrans (); / / lub wycofywania)
/ / Zamknij kursora
:: SQLFreeStmt (rs.m_hstmt, SQL_CLOSE);
/ / start transakcji 2
DB.BeginTrans ();
/ / teraz uzyskać zestaw wyników
r.PonówKwerendę ();
/ / manipulowania danymi
/ / zakończenia transakcji 2
DB.CommitTrans ();
r.(Zamknij);
DB.(Zamknij)
Innym sposobem zaimplementowania tej techniki jest pisanie nowej funkcji, RequeryWithBeginTrans, które możesz zadzwonić do rozpoczęcia następnego transakcji po zatwierdzeniu lub wycofać pierwszy. Aby napisać funkcję taką, wykonaj następujące kroki:
m_pDatabase->BeginTrans( );Teraz można nazwać tę funkcję między każdą parą transakcji:
/ / start tra&nsakcji 1 i / / Otwórz zestaw rekordów
DB.BeginTrans ();
r.(Otwórz);
/ / manipulowania danymi
/ / zakończenia transakcji 1
DB.CommitTrans (); nbsp; / / lub wycofywania)
/ / Zamknij kursora, Rozpocznij nową transakcję,
/ / i uzyskać zestaw wyników
r.RequeryWithBeginTrans ();
/ / manipulowania danymi
/ / zakończenia transakcji 2
DB.CommitTrans (); / / lub wycofywania)
Uwaga Ta technika nie należy używać, jeśli trzeba zmienić rekordów Członkowskie zmiennych m_strFilter lub m_strSort między transakcjami. W takim przypadku należy zamknąć zestaw rekordów po każdej operacji CommitTrans lub wycofywania.
Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii