Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis |
|---|
Im Folgenden technischen Hinweis ist nicht aktualisiert wurde, seitdem er erstmals in der Onlinedokumentation enthalten waren.Folglich können mehrere Prozeduren und Themen veraltet oder falsch.Die aktuellsten Informationen wird empfohlen, zum Thema Onlinedokumentations im Index finden. |
Dieser Hinweis wird beschrieben, wie Transaktionen ausführt, wenn er die MFC-ODBC-Datenbankklassen und der ODBC-Treiber von Microsoft Access 7.0, der im Treiber Desktop Microsoft ODBC, Version 3.0, enthaltene packen.
Übersicht
Wenn eine Datenbankanwendung Transaktionen ausgeführt wird, müssen Sie darauf achten, dass CDatabase::BeginTrans und CRecordset::Open in der richtigen Reihenfolge in der Anwendung aufrufen.Der Treiber Microsoft Access 7.0 verwendet das Microsoft Jet-Datenbankmodul und Jet erfordert, dass Ihre Anwendung eine Transaktion für eine beliebige Datenbank nicht gestartet, die einen geöffneten Cursor verfügt.Für die MFC-ODBC-Datenbankklassen wird ein geöffneter Cursor mit CRecordset Öffnen eines Objekts.
Wenn Sie ein Recordset öffnen, bevor Sie BeginTrans aufrufen, wird möglicherweise keine Fehlermeldungen.Allerdings aktualisiert jedes Recordset macht die Anwendung dauerhaft gezählt, nachdem es CRecordset::Update aufgerufen hat, und die Updates nicht setzen zurück, indem Rollback aufruft.Um dieses Problem zu vermeiden, müssen Sie zuerst BeginTrans aufrufen und öffnen Sie dann das Recordset.
MFC Treibers überprüft die Funktionen für Cursor-Commit und Rollback verhalten.CDatabase-Klasse stellt zweiköpfige Funktionen, GetCursorCommitBehavior und GetCursorRollbackBehavior bereit, um die Auswirkung jeder Transaktion zu bestimmen, auf dem geöffneten CRecordset-Objekt.Für den ODBC-Treiber von Microsoft Access 7.0 geben diese Memberfunktion SQL_CB_CLOSE zurück, da der Zugriff Cursor-Beibehaltung Treiber nicht unterstützt.Daher müssen Sie CRecordset::Requery aufrufen, das einem CommitTrans oder Rollback Vorgang erfolgreich war.
Wenn Sie mehrere Transaktionen nacheinander ausführen müssen, können Sie Requery nach der ersten Transaktion nicht aufrufen und dann folgendermaßen starten.Sie müssen das Recordset bevor der nächste Aufruf von BeginTrans schließen, um Jet Anforderung gerecht zu werden.In diesem technischen Hinweis werden zwei Methoden des Behandlung dieser Situation:
Das Recordset nach jedem CommitTrans oder Rollback Vorgang schließen.
Verwenden der ODBC-API-Funktion SQLFreeStmt.
Das Recordset nach jedem Vorgang CommitTrans oder Rollback geschlossen
Bevor Sie eine Transaktion starten, stellen Sie sicher, dass das Recordset-Objekt geschlossen wird.Nachdem Sie BeginTrans aufgerufen haben, rufen Sie die Öffnen-Memberfunktion des Recordsets auf.Schließen Sie das Recordset Position unmittelbar nach dem Aufrufen von CommitTrans oder Rollback.Beachten Sie, dass das Recordset öffnen und schließen Sie wiederholt die Leistung einer Anwendung verlangsamen können.
Verwenden von SQLFreeStmt
Nach dem Ende einer Transaktion Sie können die ODBC-API-Funktion SQLFreeStmt auch verwenden, um den Cursor explizit geschlossen werden soll.Um eine andere Transaktion zu beginnen, gefolgt von BeginTrans Aufruf CRecordset::Requery.Wenn Sie SQLFreeStmt aufrufen, müssen Sie das HSTMT des Recordsets als ersten Parameter und SQL_CLOSE als zweiten Parameter angeben.Diese Methode ist schneller als das Recordset zu Beginn jeder Transaktion geschlossen und öffnen.Der folgende Code zeigt, wie diese Methode implementiert wird:
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( );
Eine andere Möglichkeit, diese Methode zu implementieren, besteht darin, eine neue Funktion, RequeryWithBeginTrans zu schreiben, die Sie aufrufen können, um die nächste Transaktion zu starten, nachdem Sie das erste einen Commit oder Rollback auszuführen.Um eine solche Funktion zu schreiben, führen Sie die folgenden Schritte:
Kopieren Sie den Code für CRecordset::Requery( ) der neuen Funktion.
Fügen Sie die folgende Zeile unmittelbar nach dem Aufruf SQLFreeStmt hinzu:
m_pDatabase->BeginTrans( );
Nun können Sie diese Funktion zwischen jedem Paar von Transaktionen aufrufen:
// 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( )
Hinweis |
|---|
Verwenden Sie diese Methode, wenn Sie das Recordset membervariablen m_strFilter oder m_strSort zwischen Transaktionen ändern müssen.In diesem Fall sollten Sie das Recordset nach jedem CommitTrans oder Rollback Vorgang schließen. |
Hinweis