テクニカル ノート 68: Microsoft Access 7 ODBC ドライバーでのトランザクションの実行
[!メモ]
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。
ここでは、 MFC ODBC データベース クラスを使用すると、トランザクションを実行する方法について説明し、 Microsoft ODBC ドライバー デスクトップに含まれている Microsoft Access 7.0 ODBC ドライバーはバージョン 3.0 をパックされます。
概要
データベース アプリケーションがトランザクションを実行すると、アプリケーションの正しいシーケンスの CDatabase::BeginTrans と CRecordset::Open をダイヤルするように注意する必要があります。Microsoft Access 7.0 ドライバーは Microsoft Jet データベース エンジンを使用し、 Jet は、アプリケーション開いているカーソルがあるデータベースのトランザクションが存在する必要があります。MFC の ODBC データベース クラスでは、開いているカーソルは、開いている CRecordset にオブジェクトを一致します。
BeginTransを呼び出す前にレコードセットを開くと、エラー メッセージが表示されない場合があります。ただし、どのレコードセットはアプリケーションを作成します CRecordset::Updateを呼び出した後に永続的による更新し、更新が ロールバックを呼び出して、コピーされません。この問題を回避するには、 BeginTrans を最初にダイヤルし、次にレコードセットを開きます。
MFC は、カーソルのコミット、ロールバックの実行用のドライバーの機能をチェックします。クラス CDatabase は CRecordset の開いているオブジェクトのトランザクションの影響を確認するには、 2 とおりのメンバー関数、 GetCursorCommitBehavior と GetCursorRollbackBehaviorを提供します。Microsoft Access 7.0 ODBC ドライバーによっては、これらのメンバー関数は Access ドライバーがカーソルの保持をサポートしないため SQL_CB_CLOSE を返します。したがって、 CommitTrans または ロールバック 操作に従う CRecordset::Requery をダイヤルします。
複数のトランザクションを順番に実行する必要がある場合は、最初のトランザクションの後に Requery をダイヤルするには、次の 1 種類を開始することはできません。BeginTrans に、 Jet の要件を満たすためにレコードセットを前に回復閉じます。このテクニカル ノートは、この状況を処理する 2 とおりの方法を記述します:
CommitTrans または ロールバック の各操作の後のレコードセットを終了できます。
ODBC API 関数 SQLFreeStmtを使用します。
CommitTrans またはロールバックの各操作の後のレコードセットを閉じます。
トランザクションを開始する前に、レコードセット オブジェクトが閉じていることを確認します。BeginTransを呼び出した後、レコードセットの 開く(&&O),開く,[開く] のメンバー関数をダイヤルします。CommitTrans か ロールバックを呼び出した直後にレコードセットを閉じます。繰り返しレコードセットを開閉すると、アプリケーションのパフォーマンスが低下する可能性があることに注意してください。
を使用して SQLFreeStmt
また、明示的に、トランザクションの終了後にカーソルを閉じるには、 ODBC API 関数 SQLFreeStmt を使用できます。別のトランザクションを開始するには、呼び出し BeginTrans は CRecordset::Requeryに続けて。SQLFreeStmtを呼び出した場合、最初のパラメーターとしてレコードセットの HSTMT と 2 番目のパラメーターとして SQL_CLOSE を指定します。このメソッドは、トランザクションの開始時に完了と開始に高速です。レコードセット。次のコードは、この手法を実行する方法を示します:
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( );
この手法を実行するには、またはロールバック最初のにコミットすると新しい関数、次のトランザクションを開始するために、ダイヤルする RequeryWithBeginTransを記述することです。このような関数を記述するには、次の手順を実行します。:
新しい関数に CRecordset::Requery( ) のコードをコピーします。
SQLFreeStmtに呼び出しの直後に次の行を追加します:
m_pDatabase->BeginTrans( );
現在トランザクションの各ペア間でこの関数をダイヤルする場合:
// 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( )
[!メモ]
トランザクションの間のレコードセットのメンバー変数 m_strFilter か m_strSort を変更する必要がある場合は、この手法を使用しないでください。その場合は、 CommitTrans または ロールバック の各操作の後でレコードセットを閉じる必要があります。