注
MFC ODBC コンシューマー ウィザードは、Visual Studio 2019 以降では利用できません。 引き続き、コンシューマーを手動で作成することはできます。
このトピックでは、RFX をサポートするために MFC アプリケーション ウィザードと (「Adding an MFC ODBC Consumer」 (MFC ODBC コンシューマーの追加) で説明した) クラスの追加で記述されるコードについて、およびこれらのコードを変更する方法について説明します。
注
このトピックの内容は、バルク行フェッチが実装されていない CRecordset から派生したクラスを対象にしています。 バルク行フェッチを使用している場合は、バルク レコード フィールド エクスチェンジ (Bulk RFX) が実装されます。 Bulk RFX は、RFX に似ています。 違いを理解するには、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
MFC アプリケーション ウィザードまたはクラスの追加を使用してレコードセット クラスを作成すると、ウィザードで選択したデータ ソース、テーブル、列に基づいて、ウィザードによって RFX に関連する次の要素が自動的に記述されます。
レコードセット クラスでのレコードセット フィールド データ メンバーの宣言
CRecordset::DoFieldExchangeのオーバーライドレコードセット クラス コンストラクターでのレコードセット フィールド データ メンバーの初期化
フィールド データ メンバー宣言
ウィザードによって、CSections クラスに対してレコード セット クラスの宣言が次のような .h ファイルに書き込まれます。
class CSections : public CRecordset
{
public:
CSections(CDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CSections)
// Field/Param Data
CString m_strCourseID;
CString m_strInstructorID;
CString m_strRoomNo;
CString m_strSchedule;
CString m_strSectionNo;
// Overrides
// Wizard generated virtual function overrides
protected:
virtual CString GetDefaultConnect(); // Default connection string
virtual CString GetDefaultSQL(); // Default SQL for Recordset
virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support
// Implementation
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
};
パラメーター データ メンバーまたは自分でバインドする新しいフィールド データ メンバーを追加する場合は、ウィザードで生成されたメンバーの後にそれらを追加します。
また、ウィザードによってクラス DoFieldExchange のメンバー関数 CRecordset がオーバーライドされることにも注意してください。
DoFieldExchange オーバーライド
DoFieldExchange は RFX の中心部です。 フレームワークでデータ ソースからレコードセットに、またはレコードセットからデータ ソースにデータを移動する必要がある場合にはいつでも DoFieldExchange が呼び出されます。
DoFieldExchange では、メンバー関数 IsFieldDirty と IsFieldNull を使用したフィールド データ メンバーに関する情報の入手もサポートされています。
次の DoFieldExchange オーバーライドは、CSections クラス用です。 ウィザードによって関数がレコードセット クラスの .cpp ファイルに書き込まれます。
void CSections::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, "CourseID", m_strCourseID);
RFX_Text(pFX, "InstructorID", m_strInstructorID);
RFX_Text(pFX, "RoomNo", m_strRoomNo);
RFX_Text(pFX, "Schedule", m_strSchedule);
RFX_Text(pFX, "SectionNo", m_strSectionNo);
}
関数の次の主要機能に注目してください。
関数のこのセクションは、フィールド マップと呼ばれます。
CFieldExchange::SetFieldTypeポインターを使用したpFXへの呼び出し。 この呼び出しによって、DoFieldExchangeの末尾までのすべての RFX 関数呼び出し、または次のSetFieldTypeへの呼び出しが出力列であることが指定されます。 詳細については、「CFieldExchange::SetFieldType」を参照してください。グローバル関数
RFX_Textへの複数の呼び出し (フィールド データ メンバーごとに 1 つ、この例ではすべてCString変数)。 これらの呼び出しでは、データ ソースの列名とフィールド データ メンバー間のリレーションシップが指定されます。 RFX 関数では、実際のデータ転送が行われます。 クラス ライブラリによって、一般的なすべてのデータ型の RFX 関数が提供されます。 RFX 関数について詳しくは、「レコード フィールド エクスチェンジ: RFX 関数の使い方」をご覧ください。注
結果セットの列の順序は、
DoFieldExchangeでの RFX 関数の呼び出しの順序と一致している必要があります。フレームワークが
pFXを呼び出すときに渡す CFieldExchange オブジェクトへのDoFieldExchangeポインター。CFieldExchangeオブジェクトは、DoFieldExchangeによって実行される操作、転送の方向、およびその他のコンテキスト情報を指定します。
Recordset コンストラクター
ウィザードによって記述されるレコードセット コンストラクターには、RFX に関連する次の 2 つが含まれています。
各フィールド データ メンバーの初期化
m_nFields データ メンバーの初期化。これにはフィールド データ メンバーの数が含まれます。
CSections レコードセットのコンストラクターの例は次のようになります。
CSections::CSections(CDatabase* pdb)
: CRecordset(pdb)
{
m_strCourseID = "";
m_strInstructorID = "";
m_strRoomNo = "";
m_strSchedule = "";
m_strSectionNo = "";
m_nFields = 5;
}
注
新しい列を動的にバインドするなど、任意のフィールド データ メンバーを手動で追加した場合、m_nFields をインクリメントする必要があります。 これを行うには、次のような別のコード行を追加します。
m_nFields += 3;
これは、3 つの新しいフィールドを追加するコードです。 任意のパラメーター データ メンバーを追加する場合は、パラメーター データ メンバーの数が含まれている m_nParamsデータ メンバーを初期化する必要があります。
m_nParams の初期化はかっこの外側に配置します。