?
解决方案 »
- 请问如何将一张位图显示在DC上。要显示成椭圆的。
- 如何设置程序 exit code ?
- WriteFile()函数如何向USB设备(优盘)写文件??
- CSDN可以发彩色文字了?
- RedrawWindow()的参数如何设置才可以只更新特定的区域?
- CString 转为char *,用啥方法?
- ado中find函数的返回值是什么
- 小弟明年想到北京找个关于VC的开发工作,请给于指点。
- 如何在指定Buffer中查找特定字符串??
- 哪位高手给我一个Win2000下面读写断口的例程?或者是用于读写端口的DLL?
- 一封邮件中,是否会有多个"Boundary"?
- 关于winsock SPI WSPRecv函数截包重载问题,并关于VC初学者的一些困惑
----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)相联系,是显现于 前台的。