レコードセット (ODBC)
このトピックの内容は、MFC ODBC クラスに該当します。
CRecordset オブジェクトは、データ ソースから選択したレコードの集合を表します。 レコードは以下のいずれかで作成されます。
テーブル
クエリ
1 つ以上のテーブルにアクセスするストアド プロシージャ
たとえば、データ ソースとして顧客一覧表があるとき、これに対するテーブル タイプのレコードセットの例としては、すべてのレコードから構成される "全顧客" レコードセットが考えられます。 クエリ型レコードセットの例としては、"Joe Smith 氏宛て全請求書" レコードから構成されるレコードセットが考えられます。 ストアド プロシージャ (定義済みクエリとも呼ばれます) レコードセットの例としては、"未払いの全顧客" という条件に該当するレコードから構成されるレコードセットが考えられます。このレコードセットは、バックエンド データベースのストアド プロシージャを起動します。 1 つのレコードセットでは、同一のデータ ソースからの複数のテーブルを結合できますが、複数の異なるデータ ソースからのテーブルは結合できません。
注意
ウィザードを使用してレコードセット クラスを派生させる方法については、「MFC ODBC コンシューマーの追加」および「[データベース サポート] (MFC アプリケーション ウィザード)」を参照してください。
注意
一部の ODBC ドライバーは、データベースのビューをサポートしています。 この場合のビューとは、SQL の CREATE VIEW ステートメントによって作成されたクエリのことです。 ウィザードは現在のところビューをサポートしていませんが、自作コードでビューをサポートできます。
レコードセットの機能
どのレコードセット オブジェクトにも以下の機能が備わっています。
データ ソースが読み取り専用でないときは、レコードセットに対して更新可能、追加可能、読み取り専用のいずれかを設定できます。 レコードセットが更新可能のときは、排他または共有のロック メソッドを選択できます。ただし、ドライバーがそのロックをサポートする場合に限ります。 データ ソースが読み取り専用のときは、レコードセットも読み取り専用になります。
メンバー関数を呼び出して、選択されたレコード間をスクロール (移動) できます。
レコードをフィルター処理すると、選択するレコードをさらに限定できます。
1 つ以上の列を基準にしてレコードを並べ替え (昇順または降順) できます。
レコードセットをパラメーター化し、実行時にレコードセットの選択を限定できます。
スナップショットとダイナセット
レコードセットは、基本的に、スナップショットとダイナセットの 2 種類に分類されます。 どちらのレコードセットも、基本クラスは CRecordset クラスです。 スナップショットとダイナセットは、レコードセットとしての基本特性は同一ですが、拡張部分が異なっています。 スナップショットは、データを静的に表示するので、レポートなど、ある瞬間のデータの状態が必要なときに使うことができます。 ダイナセットでは、レコードセットに対して "クエリの再実行" つまり "最新表示" を行わずに、ほかのユーザーによる更新をレコードセット内に表示できます。 スナップショットもダイナセットも、更新可能または読み取り専用に設定できます。 ほかのユーザーによって追加または削除されたレコードを反映するには、CRecordset::Requery を呼び出します。
また、CRecordset では、他にも動的レコードセットと前方スクロール専用レコードセットという 2 種類のレコードセットも使用できます。 動的レコードセットは、ダイナセットに似ています。ただし、動的レコードセットでは、CRecordset::Requery を呼び出さずに、追加または削除されたレコードを反映できます。 このため、動的レコードセットは、DBMS での処理時間が一般的に長く、多くの ODBC ドライバーでもサポートされていません。 それに対して、前方スクロール専用レコードセットは、更新および後方スクロールを必要としないレコードセットに対して最も効率的なデータ アクセスを提供します。 たとえば、あるデータ ソースから別のデータ ソースにデータ転送を行うプログラムでは、逆方向へのスクロールが不要なため、このレコードセットを使用できます。 前方スクロール専用レコードセットを使うには、以下の両方の操作を行います。
Open メンバー関数の nOpenType パラメーターとして、CRecordset::forwardOnly オプションを渡します。
Open の dwOptions パラメーターとして CRecordset::readOnly を渡します。
注意
ダイナセット用の ODBC ドライバーの必要条件については、「ODBC の基礎」を参照してください。 Visual C++ のこのバージョンに含まれている ODBC ドライバー一覧、および他のドライバーを取得する方法については、「ODBC ドライバーの一覧」を参照してください。
レコードセットの作成
通常は、アクセスするテーブル、ビュー、またはストアド プロシージャごとに、CRecordset から派生したクラスを定義します。 ただし、データベースが結合されている場合、つまり、1 つのレコードセットが複数のテーブルの列を表している場合は例外です。 レコードセット クラスを派生させる場合には、ダイアログ データ エクスチェンジ (DDX: Dialog Data Exchange) 機構に似たレコード フィールド エクスチェンジ (RFX: Record Field Exchange) 機構またはバルク レコード フィールド エクスチェンジ (Bulk RFX: Bulk Record Field Exchange) 機構を使用します。 RFX や Bulk RFX を使用すると、データを簡単にデータ ソースからレコードセットに転送できます。RFX では、逆にレコードセットからデータ ソースにもデータを転送できます。 詳細については、「レコード フィールド エクスチェンジ (RFX)」と「レコードセット : バルク行フェッチ (ODBC)」を参照してください。
レコードセット オブジェクトでは、選択されているすべてのレコードにアクセスできます。 CRecordset のメンバー関数 MoveNext や MovePrev などを使うと、選択されたレコードの間を移動できます。 ただし、レコードセット オブジェクトでは、選択されたレコードの 1 つである現在のレコードしか表示されません。 このレコードを現在のレコードと呼びます。テーブルの列、またはデータベース クエリによって得られたレコードの列に対応するレコードセット クラスのメンバー変数を宣言すると、現在のレコードの各フィールドにアクセスできます。 レコードセット データ メンバーについては、「レコードセット : レコードセットの構造 (ODBC)」を参照してください。
レコードセット オブジェクトの使い方の詳細については、次のトピックを参照してください。 各トピックは、機能別に分類されており、順番に参照できるようになっています。