レコードセット: レコード選択のしくみ (ODBC)

Note

MFC ODBC コンシューマー ウィザードは、Visual Studio 2019 以降では利用できません。 引き続き、コンシューマーを手動で作成することはできます。

このトピックの内容は、MFC ODBC クラスに該当します。

このトピックでは、次の内容について説明します。

レコードセットでは、SQL ステートメントを ODBC ドライバーに送信することによって、そのドライバーを介してデータ ソースからレコードを選択します。 送信される SQL は、レコードセット クラスをどのように設計して開くかによって異なります。

レコードの選択のオプション

次の表に、レコードを選択する際のオプションを示します。

レコードセットに影響を与えることができる方法とタイミング

次のレベルに できます
クラスの追加ウィザードでレコードセット クラスを宣言する どのテーブルから選択するかを指定します。

どの列を含めるかを指定します。

MFC ODBC コンシューマーの追加」を参照してください。
レコードセット クラスの実装を完了する OnSetOptions (アドバンスト) などのメンバー関数をオーバーライドして、アプリケーション固有のオプションを設定するか、既定値を変更します。 パラメーター化されたレコードセットが必要な場合は、パラメーター データ メンバーを指定します。
レコードセット オブジェクトを作成する (Open を呼び出す前に) レコードをフィルターする WHERE 句で使用する検索条件 (場合によっては複合) を指定します。 「レコードセット: レコードのフィルター処理 (ODBC)」を参照してください。

レコードを並べ替える ORDER BY 句で使用するための並べ替え順序を指定します。 「レコードセット: レコードの並べ替え (ODBC)」を参照してください。

クラスに追加した任意のパラメーターのパラメーター値を指定します。 「レコードセット: パラメーターを利用したレコードセット (ODBC)」を参照してください。

|Open を呼び出してレコードセットのクエリを実行する|ウィザードによって設定された既定の SQL 文字列を置き換えるカスタム SQL 文字列を指定します。 "クラス ライブラリ リファレンス" の「CRecordset::Open」および「SQL: レコードセットの SQL ステートメントのカスタマイズ (ODBC)」を参照してください。|

|Requery を呼び出し、データ ソース上の最新の値を持つレコードセットの再クエリを実行する|新しいパラメーター、フィルター、または並べ替えを指定します。 「レコードセット: クエリの再実行 (ODBC)」を参照してください。|

レコードセットが SQL ステートメントを構築する方法

レコードセット オブジェクトの Open メンバー関数を呼び出すとき、Open によって、以下の要素の一部またはすべてを使用して SQL ステートメントが作成されます。

  • Open に渡された lpszSQL パラメーター。 このパラメーター (NULL でない場合) には、カスタム SQL 文字列またはその一部分を指定します。 フレームワークにより、文字列が解析されます。 文字列が SQL の SELECT ステートメントまたは ODBC の CALL ステートメントである場合、文字列はフレームワークによってレコードセットの SQL ステートメントとして使用されます。 文字列が "SELECT" または "{CALL" で始まっていない場合、フレームワークでは提供されたものを使用して SQL FROM 句が作成されます。

  • GetDefaultSQL によって返された文字列。 これは、既定ではウィザードでレコードセット用に指定したテーブルの名前ですが、関数から返されたものを変更できます。 フレームワークによって GetDefaultSQL が呼び出されます。文字列が "SELECT" または "{CALL" で始まっていない場合はテーブル名と見なされ、それが SQL 文字列を作成するために使用されます。

  • テーブルの特定の列にバインドされる、レコードセットのフィールド データ メンバー。 フレームワークによってレコード列がこれらのメンバーのアドレスにバインドされ、それらがバッファーとして使用されます。 フレームワークによって、レコードセットの DoFieldExchange または DoBulkFieldExchange メンバー関数での RFX または Bulk RFX 関数呼び出しからのテーブル列に対する、フィールド データ メンバーの相関関係が決定されます。

  • m_strFilter データ メンバーに含まれている、レコードセット用のフィルター (もしあれば)。 フレームワークでは、この文字列を使用して、SQL の WHERE 句が作成されます。

  • m_strSort データ メンバーに含まれている、レコードセットの並べ替え順序 (もしあれば)。 フレームワークでは、この文字列を使用して、SQL の ORDER BY 句が作成されます。

    ヒント

    SQL の GROUP BY 句 (および場合によって HAVING 句) を使用するには、フィルター文字列の末尾に句を追加します。

  • クラスに指定する任意のパラメーター データ メンバーの値。 Open または Requery を呼び出す直前にパラメーター値を設定します。 パラメーター値はフレームワークによって、SQL 文字列内の "?" プレースホルダーにバインドされます。 コンパイル時に、プレースホルダーを含む文字列を指定します。 実行時に、渡したパラメーター値に基づいてフレームワークによって詳細が入力されます。

Open によって、これらの要素から SQL の SELECT ステートメントが作成されます。 フレームワークによって要素がどのように使用されるかについて詳しくは、「選択のカスタマイズ」を参照してください。

ステートメント作成後、Open から ODBC ドライバー マネージャー (およびメモリ内にある場合は ODBC カーソル ライブラリ) に SQL が送信され、ODBC ドライバー マネージャーによって SQL は特定の DBMS の ODBC ドライバーに送信されます。 ドライバーと DBMS との通信によってデータ ソース上で選択が実行され、最初のレコードがフェッチされます。 フレームワークによってレコードがレコードセットのフィールド データ メンバーに読み込まれます。

これらの手法の組み合わせを使用して、テーブルを開き、複数のテーブルの結合に基づいてクエリを作成できます。 追加のカスタマイズにより、定義済みクエリ (ストアド プロシージャ) を呼び出し、設計時点で不明なテーブル列を選択して、それらをレコードセット フィールドにバインドすることや、他のほとんどのデータ アクセス タスクを実行することができます。 レコードセットをカスタマイズしても達成できないタスクは、ODBC API 関数を呼び出すか、CDatabase::ExecuteSQLを使用して SQL ステートメントを直接実行することで達成できます。

選択範囲のカスタマイズ

レコードセットの選択をカスタマイズするために、フィルター、並べ替え順序、またはパラメーターを指定すること以外に、次の操作を実行できます。

  • レコードセットに対して Open を呼び出すときに、lpszSQL でカスタム SQL 文字列を渡します。 lpsqSQL で渡したものはすべて、GetDefaultSQL メンバー関数から返されるものよりも優先されます。

    詳細については、「レコードセットの SQL ステートメントのカスタマイズ (ODBC)」を参照してください。Open に渡すことができる SQL ステートメント (または部分ステートメント) の種類と、それらを使用してフレームワークによって行われることについて説明しています。

    Note

    渡したカスタム文字列が "SELECT" または "{CALL" で始まっていない場合、MFC ではそれにテーブル名が含まれていると見なされます。 これは、次の項目にも適用されます。

  • ウィザードによってレコードセットの GetDefaultSQL メンバー関数に書き込まれる文字列を変更します。 返されるものを変更するには関数のコードを編集します。 既定では、ウィザードによって、1 つのテーブル名を返す GetDefaultSQL 関数が作成されます。

    lpszSQL パラメーターで Open に渡すことができる任意の項目を GetDefaultSQL から返すことができます。 lpszSQL でカスタム SQL 文字列を渡さなかった場合、GetDefaultSQL から返された文字列がフレームワークによって使用されます。 GetDefaultSQL からは少なくとも 1 つのテーブル名が返される必要があります。 しかし、複数のテーブル名、完全な SELECT ステートメント、ODBC の CALL ステートメントなどが返されるようにすることができます。 lpszSQL に渡すことができる (すなわち GetDefaultSQL から戻すことができる) ものの一覧については、「SQL: レコードセットの SQL ステートメントのカスタマイズ (ODBC)」を参照してください。

    2 つ以上のテーブルの結合を実行している場合は、GetDefaultSQL を書き換えて、SQL の FROM 句で使用されるテーブルのリストをカスタマイズします。 詳細については、「レコードセット: 結合 (ODBC)」を参照してください。

  • 実行時にデータ ソースのスキーマについて取得した情報などに基づいて、追加のフィールド データ メンバーを手動でバインドします。 フィールド データ メンバーは、レコードセット クラス、フィールド データ メンバーに対する DoFieldExchange または DoBulkFieldExchange メンバー関数への RFX または Bulk RFX 関数呼び出し、クラス コンストラクター内のデータ メンバーの初期化に追加できます。 詳細については、「レコードセット: データ列を動的に結びつける方法 (ODBC)」を参照してください。

  • OnSetOptions などのレコードセット メンバー関数をオーバーライドして、アプリケーション固有のオプションを設定するか、既定値をオーバーライドします。

複雑な SQL ステートメントをレコードセットのベースにする場合は、これらのカスタマイズ手法のいくつかの組み合わせを使用する必要があります。 たとえば、レコードセットによって直接サポートされていない SQL の句とキーワードを使用する場合や、複数のテーブを結合する場合などです。

関連項目

レコードセット (ODBC)
レコードセット: レコード更新のしくみ (ODBC)
ODBC の基礎
SQL
レコードセット: レコードのロック (ODBC)