レコードセット: レコード選択のしくみ (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 メンバー関数を呼び出すとき、 によって、以下の要素の一部またはすべてを使用して SQL ステートメントが作成されます。

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

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

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

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

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

    ヒント

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

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

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

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

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

選択のカスタマイズ

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

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

    詳細については、「SQL: レコードセットの SQL ステートメント(ODBC)のカスタマイズ」を参照してください。これは、渡し先の SQL ステートメント (または部分的なステートメント) の種類と、フレームワークで行う処理について説明しています。

    Note

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

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

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

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

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

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

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

こちらもご覧ください

レコードセット (ODBC)
レコードセット: レコードセットがレコードを更新する方法 (ODBC)
ODBC の基本
SQL
レコードセット: レコードのロック (ODBC)