ODBC: ODBC カーソル ライブラリ
このトピックでは、ODBC カーソル ライブラリとその使用方法について説明します。 詳細については、次のトピックを参照してください。
カーソル ライブラリとレベル 1 の ODBC ドライバー
カーソル ライブラリの使い方
ODBC カーソル ライブラリは、ダイナミック リンク ライブラリ (DLL) であり、ODBC ドライバー マネージャーとドライバーの間に位置します。 ODBC では、ドライバーはレコードセット内の現在位置をカーソルで追跡します。 カーソルは、レコードセット内のスクロール後の位置、つまり、現在のレコードを示します。
カーソル ライブラリとレベル 1 の ODBC ドライバー
ODBC カーソル ライブラリを使うと、レベル 1 のドライバーに以下の新しい機能が追加されます。
前方および後方へのスクロール。 レベル 2 のドライバーには、既にこの機能が備わっているため、カーソル ライブラリは不要です。
スナップショットのサポート。 カーソル ライブラリによって、自動的にスナップショットのレコードの内容を格納するバッファーが管理されます。 このバッファーでは、プログラムによるレコードの削除と編集を反映しますが、他のユーザーによる追加、削除、または編集を反映しません。 そのため、スナップショットだけがカーソル ライブラリのバッファーと同じ最新の状態になります。 自分自身が行った追加も、Requery を呼び出すまではバッファーに反映されません。 ダイナセットはカーソル ライブラリを使いません。
カーソル ライブラリを使用すると、ドライバーでサポートされていない場合でも、スナップショット (静的カーソル) を使用できます。 静止カーソルをサポートするドライバーの場合は、カーソル ライブラリを読み込む必要はありません。 カーソル ライブラリが提供する機能は、スナップショットと前方スクロール専用レコードセットです。 ドライバーがダイナセット (KEYSET_DRIVEN カーソル) をサポートしていて、実際にダイナセットを使用する場合は、カーソル ライブラリを使うことはできません。 ダイナセットとスナップショットの両方を使うには、それぞれ別の CDatabase オブジェクトを使います (2 つの異なる接続を使います)。ただし、ダイナセットとスナップショットの両方をサポートするドライバーを使う場合は、その必要はありません。
位置指定付き更新とタイムスタンプ列
注意
ODBC データ ソースには、ここで説明するように、MFC ODBC クラス経由でアクセスできます。また、MFC DAO (Data Access Object) クラス経由でもアクセスできます。
注意
SQLSetPos をサポートする ODBC ドライバーを使用していて、MFC がそれを使用できる場合、このトピックの内容は対象外です。
レベル 1 ドライバーの多くは、位置指定付き更新をサポートしていません。 位置指定付き更新をサポートしていないレベル 1 ドライバーは、カーソル ライブラリを使って、レベル 2 ドライバーの機能である位置指定付き更新機能をエミュレートします。 カーソル ライブラリは、変化しないフィールドに対して検索更新を行って、このエミュレートを実現します。
場合によっては、レコードセット内の変化しないフィールドに、タイムスタンプが格納されていることがあります。 タイムスタンプ列があるテーブルに対して MFC レコードセットを使うと、2 つの問題が生じます。
第 1 に、タイムスタンプ列を含むテーブルの更新可能スナップショットの問題があります。 スナップショットが参照しているテーブルにタイムスタンプ列が含まれている場合は、Edit と Update の呼び出しの後で Requery を呼び出す必要があります。 この関数を呼び出さないと、そのレコードを二度と変更できなくなる場合があります。 Edit を呼び出した後で Update を呼び出すと、レコードがデータ ソースに書き込まれ、タイムスタンプの値が更新されます。 ここで Requery を呼び出さないと、スナップショット内のレコードのタイムスタンプ値とデータ ソースのタイムスタンプとの間に矛盾が生じます。 このような状態でレコードを再度更新しようとすると、この矛盾が原因でデータ ソースを更新できません。
第 2 に、RFX_Date 関数で時刻情報をテーブルとやり取りする際の問題があります。これは、CTime クラスの制限による問題です。 CTime オブジェクトの処理は、データ転送時に余分な中間処理が必要なため、オーバーヘッドを伴います。 CTime オブジェクトを扱える日付の範囲も、アプリケーションによっては小さすぎる場合があります。 新しいバージョンの RFX_Date 関数は、CTime オブジェクトの代わりに、ODBC TIMESTAMP_STRUCT をパラメーターとして使用します。 詳細については、『MFC リファレンス』の「マクロ、グローバル関数、およびグローバル変数」の RFX_Date を参照してください。
カーソル ライブラリの使い方
CDatabase::OpenEx 関数または CDatabase::Open 関数を呼び出してデータ ソースに接続する場合、データ ソースに対してカーソル ライブラリを使用するかどうかを指定できます。 データ ソースのスナップショットを作成する場合は、OpenEx 関数の dwOptions パラメーターで CDatabase::useCursorLib オプションを指定するか、Open 関数の bUseCursorLib パラメーターに TRUE を指定します (既定の値は TRUE です)。 ODBC ドライバーがダイナセットをサポートしていて、ダイナセットを使用する場合は、カーソル ライブラリを使わないでください。カーソル ライブラリを使うと、ダイナセットに必要なドライバーの機能の一部が利用できなくなってしまいます。 このような場合は、OpenEx 関数に CDatabase::useCursorLib を指定しないようにするか、Open 関数の bUseCursorLib パラメーターに FALSE を指定します。