レコードセット: レコード選択のしくみ (ODBC)
このトピックの内容は、MFC ODBC クラスに該当します。
このトピックでは、次の内容について説明します。
レコード選択の設定
レコードセットによる SQL 文の作成方法とレコードの選択方法
選択処理のカスタマイズ
レコードセットは、SQL ステートメントを ODBC ドライバーに送って、データ ソースからレコードを選択します。送られる SQL ステートメントは、レコードセット クラスのデザインと、レコードセットを開くときに指定されるオプションによって異なります。
レコード選択の設定方法
次の表に、レコード選択時の設定方法を示します。
レコード選択時の設定方法
操作 |
設定 |
---|---|
クラスの追加 ウィザードを使ってレコードセット クラスを宣言する。 |
レコードを選択するテーブルを指定します。 列を指定します。 「MFC ODBC コンシューマーの追加」を参照してください。 |
レコードセット クラスのコードを作成する。 |
OnSetOptions などのメンバー関数をオーバーライドして、アプリケーション固有のオプションを指定するか、既定の処理を変更します。パラメーターを利用するときは、パラメーター データ メンバーを指定します。 |
(Open を呼び出す前に) レコードセット オブジェクトを作成する。 |
WHERE 句による検索条件 (単一または複合条件) を設定してフィルターを作成します。「レコードセット : レコードのフィルター処理 (ODBC)」を参照してください。 ORDER BY 句を使ってレコードの並べ替え順序を指定します。「レコードセット : レコードの並べ替え (ODBC)」を参照してください。 パラメーターを追加したときは、パラメーター値を設定します。「レコードセット : パラメーターを利用したレコードセット (ODBC)」を参照してください。 |
Open を呼び出してクエリを実行する。 |
ウィザードが生成した SQL 文字列を書き換えます。『MFC リファレンス』の「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 文字列の "?" プレースホルダーをパラメーター値で置き換えます。コンパイル時は、SQL 文字列に "?" プレースホルダーを作成しておきます。このプレースホルダーには、実行時に指定されるパラメーターの値に基づいて具体的な値が代入されます。
Open によって、これらのデータに基づく SQL SELECT ステートメントが作成されます。フレームワークがこれらのデータを利用するしくみについては、「選択処理のカスタマイズ」を参照してください。
Open は、作成した SQL ステートメントを ODBC ドライバー マネージャーおよび ODBC カーソル ライブラリ (メモリ上にあるとき) に送ります。ODBC ドライバー マネージャーは、この SQL ステートメントを使用する DBMS の ODBC ドライバーに送ります。ドライバーは、DBMS と連係して、データ ソースに対する選択処理を実行し、最初のレコードを取り出します。フレームワークは、レコードの内容をレコードセットのフィールド データ メンバーに転送します。
ここで説明した手法を組み合わせると、テーブルを開くことも結合した複数のテーブルにアクセスするクエリを作成することもできます。さらにカスタマイズすると、定義済みクエリ (ストアド プロシージャ) を呼び出したり、新しく追加したテーブル列をレコードセット フィールドにバインドしたりできます。また、その他さまざまなデータ アクセス処理を実行できます。レコードセットのカスタマイズによって実現できない処理は、ODBC API 関数を呼び出すか、CDatabase::ExecuteSQL を使用して SQL ステートメントを直接呼び出すことによって実現できます。
選択処理のカスタマイズ
フィルター、並べ替え順序、パラメーター以外にも、次の方法でレコードセットの選択処理をカスタマイズできます。
カスタム SQL 文字列 lpszSQL を Open に渡す方法。lpsqSQL で渡した文字列は、メンバー関数 GetDefaultSQL の戻り値 (既定 SQL 文字列) より優先されます。
詳細については、「SQL : レコードセットの SQL ステートメントのカスタマイズ (ODBC)」を参照してください。ここでは、Open に渡すことのできる SQL ステートメント (または部分的なステートメント) の種類、およびフレームワークがそのステートメントを使用して行う処理ついて説明しています。
[!メモ]
"SELECT" または "{CALL" で始まらないカスタム文字列を渡すと、テーブル名を含むものと見なされます。これは、次の項目にも該当します。
ウィザードが作成したメンバー関数 GetDefaultSQL の中の文字列を書き換える方法。関数内部のコードを書き換えて、関数が返す文字列を変更します。既定では、ウィザードは、1 つのテーブルの名前を返す GetDefaultSQL を作成します。
Open のパラメーター lpszSQL で渡せる文字列は、GetDefaultSQL の戻り値として使用できます。カスタム SQL 文字列を lpszSQL に渡さない場合、フレームワークは GetDefaultSQL が返す文字列を使用します。GetDefaultSQL は 1 つ以上のテーブル名を返す必要がありますが、複数のテーブル名、完全な SELECT ステートメント、ODBC CALL ステートメントなどを返すように書き換えてもかまいません。lpszSQL に渡すことができる文字列、つまり GetDefaultSQL の戻り値として使用できる文字列の一覧については、「SQL : レコードセットの SQL ステートメントのカスタマイズ (ODBC)」を参照してください。
複数のテーブルを結合するときは、GetDefaultSQL を書き換えて、SQL FROM 句で指定されるテーブル リストを変更します。詳細については、「レコードセット : 結合 (ODBC)」を参照してください。
追加のフィールド データ メンバーを結び付ける方法。通常は、実行時にデータ ソースから得られる情報に基づいてデータ メンバーを作成します。レコードセット クラスにフィールド データ メンバーを追加してから、DoFieldExchange または DoBulkFieldExchange でそれに対応する RFX 関数または Bulk RFX 関数を呼び出して、レコードセット クラス コンストラクターでデータ メンバーを初期化します。詳細については、「レコードセット : データ列を動的に結び付ける方法 (ODBC)」を参照してください。
OnSetOptions などのレコードセット メンバー関数をオーバーライドする方法。既定の処理を変更できます。
複雑な SQL ステートメントが必要なレコードセットでは、これらのカスタマイズ手法を組み合わせて使用する必要があります。たとえば、レコードセットで直接サポートされていない SQL 句やキーワードを使用したり、複数のテーブルを結合したりする場合があります。