レコード フィールド エクスチェンジ: ウィザード コードの操作

注

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 の初期化はかっこの外側に配置します。

関連項目

レコード フィールド エクスチェンジ (RFX)