TN068: Durchführen von Transaktionen mit dem Microsoft Access 7-ODBC-Treiber

Diese Notiz beschreibt, wie Sie Transaktionen durchführen, wenn die MFC-ODBC-Datenbankklassen und dem Microsoft Access 7.0 ODBC-Treiber in der Microsoft ODBC Desktop Driver Pack-Version 3.0 enthalten.

Übersicht

Wenn Ihre Datenbankanwendung Transaktionen durchführt, müssen Sie aufrufen, CDatabase::BeginTrans und CRecordset:: Open in der richtigen Reihenfolge in Ihrer Anwendung vorsichtig sein. Der Treiber Microsoft Access 7.0 verwendet das Microsoft Jet-Datenbankmodul, und Jet setzt voraus, dass Ihre Anwendung nicht in jeder Datenbank eine Transaktion beginnen, die einen geöffneten Cursor hat. Für die MFC-ODBC-Datenbankklassen entspricht ein geöffneten Cursor ein CRecordset -Objekt öffnen.

Wenn Sie eine Recordset öffnen Sie vor dem Aufrufen von BeginTrans, möglicherweise keine Fehlermeldungen angezeigt. Jedoch werden alle Recordset-Aktualisierungen, die Ihre Anwendung permanent werden nach dem Aufruf von CRecordset:: Updatemacht, und die Updates kein Rollback werden durch Aufrufen von Rollback. Um dieses Problem zu vermeiden, müssen Sie rufen Sie BeginTrans zuerst und dann öffnen Sie das recordset.

MFC prüft die Treiber Funktionalität für Cursorverhalten Commit und Rollback. Klasse CDatabase enthält zwei Memberfunktionen, GetCursorCommitBehavior und GetCursorRollbackBehavior, die Auswirkungen jeder Transaktion auf Ihre geöffnete CRecordset -Objekt zu bestimmen. Für den Microsoft Access 7.0 ODBC-Treiber zurückgeben dieser Memberfunktionen SQL_CB_CLOSE , da der Access-Treiber Cursor Erhaltung nicht unterstützt. Daher müssen Sie CRecordset:: Requery folgt einen CommitTrans oder Rollback -Vorgang aufrufen.

Wenn Sie mehrere Transaktionen nacheinander ausführen müssen, ist nicht nach der ersten Transaktion aufrufen Requery und starten Sie dann die nächste ein. Schließen Sie das Recordset vor dem nächsten Aufruf von BeginTrans um Jet-Anforderung zu erfüllen. Diese technische Hinweis beschreibt zwei Methoden zum Umgang mit dieser situation:

Schließen das Recordset nach jedem CommitTrans oder Rollback-Vorgang

Stellen Sie bevor Sie eine Transaktion starten sicher, dass das Recordsetobjekt geschlossen wird. Rufen Sie nach dem Aufrufen der BeginTrans, Open -Memberfunktion des Recordsets. Schließen Sie das Recordset, sofort nach dem Aufruf von CommitTrans oder Rollback. Beachten Sie, dass wiederholte Öffnen und schließen das Recordset die Leistung einer Anwendung verlangsamen können.

Verwenden ' SQLFreeStmt '

Sie können auch die ODBC API-Funktion ' SQLFreeStmt ' auf , explizit schließen des Cursors nach Beendigung einer Transaktion. Um eine andere Transaktion zu starten, rufen Sie BeginTrans gefolgt von CRecordset:: Requery. Wenn Sie SQLFreeStmtaufrufen, müssen Sie das Recordset HSTMT als erstem Parameter und SQL_CLOSE als zweiten Parameter angeben. Diese Methode ist schneller als schließen und Öffnen des Recordsets zu Beginn jeder Transaktion. Der folgende Code veranschaulicht diese Technik

 CMyDatabase Db;
DB.Öffnen Sie ("MYD&ATASOURCE");
CMyRecordset Rs (Amp; Db);

/ / Starten Sie Transaktion 1 und / / Recordset öffnen
DB.BeginTrans ();
Rs.(Offen);

/ / Daten ändern

/ / Ende der Transaktion 1
DB.CommitTrans ();  / / oder Rollback)

/ / Schließen des Cursors
:: SQLFreeStmt (SQL_CLOSE, rs.m_hstmt);

/ / Starten Sie Transaktion 2
DB.BeginTrans ();

/ / jetzt erhalten die Ergebnismenge
Rs.Requery ();

/ / Daten ändern

/ / Ende der Transaktion 2
DB.CommitTrans ();

Rs.(Schließen);
DB.(Schließen)

Eine andere Möglichkeit, diese Technik zu implementieren ist eine neue Funktion, RequeryWithBeginTrans, schreiben, die Sie aufrufen können, starten Sie die nächste Transaktion, nachdem Sie begehen oder Rollback ersten. Führen Sie die folgenden Schritte aus um solch eine Funktion schreiben,:

  1. Kopieren Sie den Code für die neue Funktion für CRecordset:: Requery).

  2. Fü&gen Sie die folgende Zeile unmittelbar nach dem Aufruf von SQLFreeStmt:
    m_pDatabase-gt;BeginTrans( );

Jetzt können Sie diese Funktion zwischen jedem Paar von Transaktionen aufrufen.:

/ / Starte&n Sie Transaktion 1 und / / Recordset öffnen
DB.BeginTrans ();
Rs.(Offen);

/ / Daten ändern

/ / Ende der Transaktion 1
DB.CommitTrans (); / / oder Rollback)

/ / Schließen des Cursors, neue Transaktion starten
/ / und das Resultset zu erhalten
Rs.RequeryWithBeginTrans ();

/ / Daten ändern

/ / Ende der Transaktion 2
DB.CommitTrans ();  / / oder Rollback)

Hinweis&Nbsp;  Verwenden Sie diese Technik nicht, wenn Sie die Recordset Member-Variablen M_strFilter und M_strSort zwischen Transaktionen ändern müssen. In diesem Fall sollten Sie das Recordset nach jedem CommitTrans oder Rollback -Vorgang schließen.

Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie

Index