TN068: Microsoft Access 7 ODBC ドライバーでトランザクションを実行します。

このときに MFC ODBC データベース クラスと Microsoft ODBC Desktop Driver Pack バージョン 3.0 に含まれる Microsoft Access 7.0 ODBC ドライバーを使用してトランザクションを実行する方法について説明します。

概要

データベース アプリケーションのトランザクションを実行する場合は、アプリケーションに正しい順序でCDatabase::BeginTransCRecordset::Openを呼び出すように注意する必要があります。Microsoft Access 7.0 ドライバー、Microsoft Jet データベース エンジンを使用して、Jet アプリケーションで開いているカーソルを持つ任意のデータベース トランザクションを開始しないことが必要です。MFC ODBC データベース クラスは、オープン カーソルを開いているCRecordsetオブジェクトに相当します。

BeginTransを呼び出す前に、レコード セットを開く場合は、エラー メッセージは表示しない可能性があります。ただし、 CRecordset::Updateを呼び出した後は、永続的にあなたのアプリケーションにレコード セット更新と、更新はRollbackを呼び出すことロールバックされますされません。この問題を回避するには、あらかじめBeginTransを呼び出して、レコード セットを開く。

MFC は、ドライバー機能カーソルのコミットとロールバックの動作をチェックします。クラスのCDatabase GetCursorCommitBehaviorGetCursorRollbackBehavior、すべてのトランザクションを開いているCRecordsetオブジェクトの影響を判断する 2 つのメンバー関数を提供します。アクセス ドライバーがカーソルの保存をサポートしていないため、Microsoft Access 7.0 ODBC ドライバーのSQL_CB_CLOSEこれらのメンバー関数を返します。したがって、 CommitTransまたはロールバック操作後:requeryを呼び出す必要があります。

1 つの別の複数のトランザクションを実行する必要がある場合は、再クエリを実行した後の最初のトランザクションを呼び出すし、次のいずれかを起動することはできません。BeginTransジェットの要件を満たすために次の呼び出しの前にレコード セットを閉じる必要があります。このテクニカル ノートでこのような状況を処理する 2 つの方法について説明します:

各 CommitTrans またはロールバック後のレコード セットを閉じる

トランザクションを開始する前に、recordset オブジェクトが閉じていることを確認します。BeginTransを呼び出した後で、レコード セットのOpenメンバー関数を呼び出します。CommitTransまたはRollbackの呼び出し後すぐにレコード セットを閉じます。繰り返しを開くと、レコード セットを閉じる、アプリケーションのパフォーマンスが低下することに注意してください。

SQLFreeStmt を使用してください。

トランザクションの終了後、カーソルを明示的に閉じる、ODBC API 関数SQLFreeStmtを使用することもできます。別のトランザクションを開始するには、 :requeryによって続いてBeginTransを呼び出します。SQLFreeStmtを呼び出し、最初のパラメーターと 2 番目のパラメーターとしてSQL_CLOSEとして、レコード セットの HSTMT を指定する必要があります。このメソッドは終了し、すべてのトランザクションの開始時にレコード セットを開くより高速です。この手法を実装する方法を次に示します

 CMyDatabase db;db。(「MYDATASOURCE」) を開きます。CMyRecordset rs (amp; db);//1 のトランザクションを開始、・ ・、レコード セットを開くdb。BeginTrans ();rs。開く ();//データの操作//終了トランザクション 1db。CommitTrans ();//またはロールバック)//、カーソルを閉じる: SQLFreeStmt (rs.m_hstmt、SQL_CLOSE);//トランザクション 2 を開始db。BeginTrans ();//今、結果セットを取得します。rs。() を再クエリ;//データの操作//終了トランザクション 2db。CommitTrans ();rs。閉じる ();db。閉じる)(&A)

この手法を実装する別の方法は、新しい機能、 RequeryWithBeginTrans次のコミット後のトランザクションまたはロールバック、最初の 1 つを開始する呼び出すことができますを書くことです。このような関数を記述するには、次の手順を実行をします:

  1. コピー :requery ()のコードを新しい関数。

  2. SQLFreeStmtの呼び出しの直後後には、次の行を追加します。
    m_pDatabase-gt;BeginTrans(& );

現在のトランザクションの各ペア間でこの関数を呼び出すことができます。:

//1 のトランザクションを開始、・ ・、レコード セットを開くdb。BeginTrans ();rs。開く ();//データの操作//終了トランザクション 1db。CommitTrans (); 特価;//またはロールバック)//、カーソルを閉じて、新しいトランザクションを開始・ ・と、結果セットの取得rs。RequeryWithBeginTrans ();//データの操作//終了トランザクション 2db。CommitTrans ();//またはロールバック)(&N)

特価;レコード セット メンバー変数m_strFilterまたはm_strSortトランザクション間を変更する必要がある場合は、このテクニックを使用しないでください。その場合は、 CommitTransまたはロールバック操作が終わた後たびにレコード セットを閉じる必要があります。(&N)。

番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)

Index