レコード フィールド エクスチェンジ: ウィザード コードの操作
Note
MFC ODBC コンシューマー ウィザードは、Visual Studio 2019 以降では利用できません。 引き続き、コンシューマーを手動で作成することはできます。
このトピックでは、RFX をサポートするために MFC アプリケーション ウィザードと (「Adding an MFC ODBC Consumer」 (MFC ODBC コンシューマーの追加) で説明した) クラスの追加で記述されるコードについて、およびこれらのコードを変更する方法について説明します。
Note
このトピックの内容は、バルク行フェッチが実装されていない 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
};
パラメーター データ メンバーまたは自分でバインドする新しいフィールド データ メンバーを追加する場合は、ウィザードで生成されたメンバーの後にそれらを追加します。
また、ウィザードによってクラス CRecordset
のメンバー関数 DoFieldExchange
がオーバーライドされることにも注意してください。
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);
}
関数の次の主要機能に注目してください。
関数のこのセクションは、フィールド マップと呼ばれます。
pFX
ポインターを使用したCFieldExchange::SetFieldType
への呼び出し。 この呼び出しによって、DoFieldExchange
の末尾までのすべての RFX 関数呼び出し、または次のSetFieldType
への呼び出しが出力列であることが指定されます。 詳細については、「CFieldExchange::SetFieldType」を参照してください。グローバル関数
RFX_Text
への複数の呼び出し (フィールド データ メンバーごとに 1 つ、この例ではすべてCString
変数)。 これらの呼び出しでは、データ ソースの列名とフィールド データ メンバー間のリレーションシップが指定されます。 RFX 関数では、実際のデータ転送が行われます。 クラス ライブラリによって、一般的なすべてのデータ型の RFX 関数が提供されます。 RFX 関数について詳しくは、「レコード フィールド エクスチェンジ: RFX 関数の使い方」をご覧ください。Note
結果セットの列の順序は、
DoFieldExchange
での RFX 関数の呼び出しの順序と一致している必要があります。フレームワークが
DoFieldExchange
を呼び出すときに渡す CFieldExchange オブジェクトへのpFX
ポインター。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;
}
Note
新しい列を動的にバインドするなど、任意のフィールド データ メンバーを手動で追加した場合、m_nFields
をインクリメントする必要があります。 これを行うには、次のような別のコード行を追加します。
m_nFields += 3;
これは、3 つの新しいフィールドを追加するコードです。 任意のパラメーター データ メンバーを追加する場合は、パラメーター データ メンバーの数が含まれている m_nParamsデータ メンバーを初期化する必要があります。 m_nParams
の初期化はかっこの外側に配置します。