在ODBC中应用DDX和RFX;MFC中ODBC类库简介----MFC中针对OD; RFX_Date;Ctime;----它们大多有三个参数(个别会有四或五个):;用,它为RFX函数提供了一个指向CFieldEx; ----在DDX双向数据交换中,用户不直接调用;了数据交换的方向:----direct=FALS;voidCTestodbcView::OnBu
在 ODBC 中应用 DDX 和 RFX
MFC 中 ODBC 类库简介 ----MFC 中针对 ODBC 数据库编程提供了五种基类。这些类封装了有关 ODBC 的 API 调用,使用 户能够利 用 ODBC 完成不同类型的数据库编程工作,如访 问 Foxpro、 从而 dBASE 或 Sybase 等不同类型数据库文件, 避开各种类型数据库文件的复杂的内部结构。这五种基类是: CDatabase 类对象表示与数据源的连接。用户正是基于此连接实现对数据源的操作。 CRecordset 类对象表示了从数据源中选出的一组记录。该对象使用户能完成在记录间的滚动、更新 记录、对记录进行过滤排序等操作。 CRecordView 类对象直接与一 CRecordset(记录集)类对象连接,为该记录集提供显示的视图。它是 数据库操作的界面。 CFieldExchange 类支持数据库的字段交换过程,即 RFX 机制。 CDBException 类完成数据库类操作的异常处理。 用户可根据其中公用成员 变量的取值来分析出现 错误的原因或显示出相应的文本信息。 以下我们利用 VC 中的 AppWizard 生成一个简单的示例程序以供使用: ---- 1.选择[File]中的[New],在弹出的对话框中选择文件类型为 [MFC AppWizard(EXE)]。在[Project name]中 键入文件名,如: testodbc,点按[OK]按钮。 ---- 2.在程序类型中选择[Single document], 点按[Next]按钮。 ---- 3.在数据库支持中选择[Database view with file support],点按 [Data source]按钮进入数据库选择对话框。 ---- 4.在[Datasource]中选择[ODBC],然后在下拉列表中选择 [Visual Foxpro Tables]。[Recordset type]设定为 [Snapshot]。 点按[OK]按钮选择数据库源文件:test.dbf。 ---- 5.选择了数据库源文件后,接连点按[Next],生成程序所需的源文件。 ---- 此时生成以下各类及其对象: CAboutDlg CMainFrame CTestodbcApp CTestodbcDoc CTestodbcSet CTestodbcView RFX 简介 ----RFX 是 Record Field Exchange 的缩写, 意即记录字段数据交换。 它在用户选择的记录集(Data set) 和隐藏 于后台的数据源(Data source)之间建立对应关系,使用户能通过操作此记录集来实现对数据源的操作。MFC 中提供了一系列 RFX 调用函数,通过这些函数,可以随时在记录集和数据源之间进行数据交换,这种交换 是双向的。这些函数有: 函数 RFX_Bool RFX_Byte RFX_Binary RFX_Double RFX_Single RFX_Int RFX_Long RFX_LongBinary RFX_Text 数据类型 BOOL BYTE CByteArray double float int lonig CLongBinary CString
RFX_Date
Ctime
----它们大多有三个参数(个别会有四或五个): 一个指向 CFieldExchange 类对象的指针 数据源中的一个字段名 与该字段对应的变量名 ---- 当用 AppWizard 生成代码时,程序会自动选择适当的函数与数据类型相匹配。 ---- 记录字段数据交换的核心是 CRecordset 类中的虚函数 DoFieldExchange, RFX 函数都在 DoFieldExchange 中调
用,它为 RFX 函数提供了一个指向 CFieldExchange 类对象的指针,其原 型为: ---- virtual void DoFieldExchange(CFieldExchang pFX); ----上文示例中生成的 CTestodbcSet 类是从 CRecordset 派生而来的,为了利用 RFX 机制,它声明了两个成员 变量: CString m_name 和 CString m_age, 分别对应数据库表文件中的[name] 和[age] 字段。 CTestodbcSet 在 类重载的方法 DoFieldExchange(CFieldExchange * pFX)中,可以看到调用了两个 RFX 函数: ----RFX_Text(pFX, _T("[name]"), m_name); ----RFX_Text(pFX, _T("[age]"),m_age); pFX 参数即为 DoFieldExchange 传递来的 CFieldExchange 类对象指针。 DDX 简介 ----DDX 是 Dialog Data Exchange 的缩写,意即对话框数据交换。它在对话框 的可视控件(Controls)和成员变 量(Member variables)之间建立双向的对应关系, 使 用 户 能通过对话框上的控件浏览和修改变量的取值。 ----类似记录字段数据交换,对话框数据交换的核心是 CRecordView 类中的虚函数 DoDataExchange,DDX 函数都在 DoDataExchange 中调用,它为 DDX 函数提供了一个指 向 CDataExchange 类对象的指针,其原型 为: ----virtual void DoDataExchange(CDataExchan pDX); ----进入函数 Ctestodbc::DoDataExchange,此时函数体中没有什么代码,因为我 们并没有在对话框中创建控 件,也没有建立 DDX 机制。 ----打开示例程序的对话框资源,编辑自动生成的对话框 IDD_TESTODBC_FORM,此 时,该对话框中仅有 一个静态文本对象 “TODO: Place form controls on this dialog.”。 它是自动生成的提示性文本,表示可在此对话框上添加控件。删掉此文本,添加两 个编辑框对象(Edit box)IDC_EDIT1 和 IDC_EDIT2,在 IDC_EDIT1上按鼠标右键,选 择弹出菜单中的[ClasWizard]进入类属性 编辑对话框。选择[Member Variables]属 性,在[Control IDs]中选择 IDC_EDIT1,然后按[Add Variable]按钮以 选择与它对 应的变量,在下拉列表框[Member Variable name]中选择 m_pSet ->m_name, 按[OK]返回。用 同样方法为 IDC_EDIT2 选择 m_pSet ->m_age。 ----退出对话框编辑,再进入类 CTestodbcView 源文件中,发现函数 DoDataExchange 中增加了两个 DDX 调 用函数: ----DDX_FieldText(pDX, IDC_EDIT1, m_pSet ->m_name,m_pSet); ----DDX_FieldText(pDX, IDC_EDIT2, m_pSet ->m_age,m_pSet); ----DDX_FieldText 函数在对话框的编辑控件和记录的字段之间建立联系。 它可以 自动管理以下类型的数据: int、short、long、DWORD、Cstring、float、double、BOOL 和 BYTE。 它的四个参数分别为: 一个指向 CDataExchange 类对象的指针 与数据交换相关的对话框控件的 ID 号 记录中的一个字段 与数据交换相关的记录集对象指针
----在 DDX 双向数据交换中,用户不直接调用 DoFieldExchange 函数,而是调用函 数 UpdateData(BOOL direct),此函数的 direct 参数决定
了数据交换的方向: ----direct=FALSE 用记录的字段值更新控件值 ----direct=TRUE 用控件值更新记录的字段值 ----例如我们在对话框中添加一个[Save]按钮,在它的事件处理过程中将控件的值 保存:
void CTestodbcView::OnButtonSave() { ... UpdateData(TRUE); ... } DDX 和 RFX 的关系及比较 ----从上面可以看出,RFX 是数据库编程中数据交换的内部基础,它更紧密地与记 录集对象(CRecordset)相 联系,是隐于后台的;DDX 是数据库编程中数据交换在对 话框界面上实现的基础,它更紧密地与视图对象 (CRecordView)相联系,是显现于 前台的。
联系客服