记录字段交换:使用向导代码
注意
MFC ODBC 使用者向导在 Visual Studio 2019 及更高版本中不可用。 你仍可以手动创建使用者。
本主题介绍 MFC 应用程序向导和“添加类”(如添加 MFC ODBC 使用者中所述)编写的用于支持 RFX 的代码,以及你可能需要如何更改此代码。
注意
本主题适用于从 CRecordset
派生的类,其中尚未实现批量提取行。 如果使用批量提取行,则将实现批量记录字段交换(批量 RFX)。 批量 RFX 与 RFX 类似。 若要了解区别,请参阅记录集:批量提取记录 (ODBC)。
使用 MFC 应用程序向导或“添加类”创建记录集类时,向导将根据你在向导中选择的数据源、表和列选项编写以下与 RFX 相关的元素:
记录集类中记录集字段数据成员的声明
CRecordset::DoFieldExchange
的替代记录集类构造函数中记录集字段数据成员的初始化
字段数据成员声明
向导将在 .h 文件中编写记录集类声明,类似于类 CSections
的以下内容:
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
结束或下一次调用SetFieldType
之前所有 RFX 函数调用都是输出列。 有关详细信息,请参阅 CFieldExchange::SetFieldType。多次调用
RFX_Text
全局函数 - 每个字段数据成员一次(示例中所有的成员都是CString
变量)。 这些调用指定数据源上的列名称与字段数据成员之间的关系。 RFX 函数执行实际的数据传输。 类库为所有常见数据类型提供 RFX 函数。 有关 RFX 函数的详细信息,请参阅记录字段交换:使用 RFX 函数。注意
结果集中列的顺序必须与
DoFieldExchange
中 RFX 函数调用的顺序匹配。当它调用
DoFieldExchange
时框架传递的 CFieldExchange 对象的pFX
指针。CFieldExchange
对象指定DoFieldExchange
要执行的操作、传输方向和其他上下文信息。
记录集构造函数
向导编写的记录集构造函数包含两个与 RFX 相关的操作:
初始化每个字段数据成员
初始化 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;
这是用于添加三个新字段的代码。 如果添加任何参数数据成员,则必须初始化 m_nParams 数据成员,其中包含参数数据成员的数量。 将 m_nParams
初始化放置在括号外。