?

解决方案 »

  1.   

    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)相联系,是显现于 前台的。