郁闷阳光的专栏

欢迎朋友们经常来逛逛,一起交流

在 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                  BOOL
RFX_Byte                  BYTE
RFX_Binary              CByteArray
RFX_Double              double
RFX_Single              float
RFX_Int                    int
RFX_Long                  lonig
RFX_LongBinary      CLongBinary
RFX_Text                  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)相联系,是显现于 前台的。

阅读更多
个人分类: MFC/数据库 WINDOWS
想对作者说点什么? 我来说一句

超市物流管理系统演示文档

2010年02月14日 2.79MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭