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 を指定します。