ODBC: ODBC カーソル ライブラリ

このトピックでは、ODBC カーソル ライブラリについて、およびその使用方法について説明します。 詳細については、以下を参照してください:

ODBC カーソル ライブラリは、ODBC ドライバー マネージャーとドライバーの間に存在するダイナミック リンク ライブラリ (DLL) です。 ODBC との関連では、ドライバーにそのドライバーのレコード セット内の位置を追跡するカーソルが保持されます。 カーソルによって、スクロール済みのレコードセット内の位置 (現在のレコード) がマークされます。

カーソル ライブラリとレベル 1 ODBC ドライバー

ODBC カーソル ライブラリにより、レベル 1 ドライバーに次の機能が提供されます。

  • 前方および後方スクロール。 レベル 2 ドライバーは既にスクロール可能であるため、カーソル ライブラリを必要としません。

  • スナップショットのサポート。 スナップショットのレコードが格納されるバッファーは、カーソル ライブラリによって管理されます。 このバッファーには、自分が行うプログラムの削除とレコードに対する編集が反映されますが、他のユーザーの追加、削除、編集は反映されません。 そのため、スナップショットはカーソル ライブラリのバッファーと同程度にのみ最新になります。 また、Requery を呼び出すまで、バッファーには自分が行った追加が反映されません。 ダイナセットでカーソル ライブラリは使用されません。

カーソル ライブラリによって、ドライバーが通常対応していない場合でも、スナップショット (静的カーソル) が提供されます。 ドライバーが既に静的カーソルに対応している場合は、スナップショットのサポートを取得するためにカーソル ライブラリを読み込む必要はありません。 カーソル ライブラリを使用する場合は、スナップショットと前方スクロール専用レコードセットのみを使用できます。 ドライバーがダイナセット (KEYSET_DRIVEN カーソル) に対応しており、それらを使用する必要がある場合は、カーソル ライブラリを使用してはなりません。 スナップショットとダイナセットの両方を使用する必要がある場合は、ドライバーが両方に対応していない限り、2 つの異なる CDatabase オブジェクト (2 つの異なる接続) をベースとする必要があります。

位置指定更新とタイムスタンプ列

Note

ODBC データ ソースには、ここで説明するように、MFC ODBC クラス経由でアクセスできます。また、MFC DAO (Data Access Object) クラス経由でもアクセスできます。

Note

お使いの ODBC ドライバーが SQLSetPos に対応している (使用可能な場合に MFC で使用される) 場合、このトピックは適用されません。

ほとんどのレベル 1 ドライバーは、位置指定更新に対応していません。 そのようなドライバーでは、この点に関してレベル 2 ドライバーの機能をエミュレートするために、カーソル ライブラリに依存しています。 カーソル ライブラリでは、変化しないフィールドに対して検索更新を実行することで、位置指定更新のサポートをエミュレートします。

場合によっては、レコードセットに、変化しないフィールドの 1 つとしてタイムスタンプ列が含まれていることがあります。 タイムスタンプ列が含まれるテーブルで MFC レコードセットを使用すると、2 つの問題が発生します。

1 つ目の問題は、タイムスタンプ列が含まれるテーブルの更新可能なスナップショットに関する問題です。 スナップショットがバインドされているテーブルにタイムスタンプ列が含まれている場合は、EditUpdate を呼び出した後に、Requery を呼び出してください。 それ以外の場合は、同じレコードを再び編集できなくなるおそれがあります。 Edit を呼び出してから Update を呼び出すと、データ ソースにレコードが書き込まれ、タイムスタンプ列が更新されます。 Requery を呼び出さない場合、スナップショット内のレコードのタイムスタンプ値が、データソース上の対応するタイムスタンプと一致しなくなります。 レコードを再度更新しようとすると、不一致のためにデータ ソースで更新が許可されない場合があります。

2 つ目の問題は、RFX_Date 関数と共に使用してテーブルとの間で時刻と日付の情報を転送するときの、CTime クラスの制限事項に関する問題です。 CTime オブジェクトを処理すると、データ転送中に余分な中間処理の形式でオーバーヘッドが発生します。 一部のアプリケーションにとって、CTime オブジェクトの日付範囲が非常に限定的である場合もあります。 RFX_Date 関数の新しいバージョンでは、CTime オブジェクトではなく、ODBC の TIMESTAMP_STRUCT パラメーターを受け取ります。 詳細については、"MFC リファレンス" のマクロとグローバルに関する記事で、RFX_Date を参照してください。

カーソル ライブラリの使用

CDatabase::OpenEx または CDatabase::Open を呼び出してデータ ソースに接続すると、そのデータ ソースのカーソル ライブラリを使用するかどうかを指定できます。 そのデータ ソースにスナップショットを作成する場合は、dwOptions パラメーターの CDatabase::useCursorLib オプションを OpenEx に指定するか、bUseCursorLib パラメーターの TRUE を Open に指定します (既定値は TRUE です)。 お使いの ODBC ドライバーがダイナセットに対応しており、データ ソースでダイナセットを開く必要がある場合は、カーソル ライブラリを使用しないでください (ダイナセットに必要なドライバー機能の一部がマスクされます)。 その場合は、OpenExCDatabase::useCursorLib を指定したり、OpenbUseCursorLib パラメーター に FALSE を指定したりしないでください。

関連項目

ODBC の基礎