Visual C++ 2008入门经典 第二十章 链接到数据源
/*
第二十章 链接到数据源
主要内容:
SQL及其使用方法
如何使用SQL select操作检索数据
MFC支持哪里些数据库服务
什么是记录集对像,它如何链接到关系数据库表
记录集对像如何检索数据库的信息
记录视图如何显示记录集的信息
如何创建数据库程序的项目
如何把记录集添加到程序中
如何处理多记录视图
20.1 数据库基础知识
20.2 SQL
20.2.1 使用SQL检索数据
选择记录
20.2.3 对记录进行排序
20.3 MFC中的数据库支持
将MFC用于数据库应用程序开发时需要进行选择,因为MFC支持两种主要方法,如下所示
OLE DB:它提供了一种使用COM(又被称为ActiveX)访问本地和远程数据库的方法
OLE DB由ADO(ActiveX数据对像)使用,ADO提供了一种有效地访问本地和远程数据库的方法,它没有FMC蜀固有的系统开销
ODBC: 即开放式数据库连接,它为数据访问定义了一种面向标准函数的接口,很多数据库产品供应商都支持这种接口,
支持ODBC的五个MFC类如表下
CDatabase 这个类的对像表示到数据库的一个连接,在对数据库进行操作前,这个连接必须存在
CRecordset 派生于这个类的类的对像表示SQL SELECT操作的结果--一个记录集合,这个对像一次使用该集合中的一个记录可用,利用它提供的函数,可以在该集合中向前或向后移动
CRecordView 派生于这个类的类的对像用于显示关联记录集对像的当前信息,视图实际上是一个对话框,CRecordset对像使用对话框数据交换(DDX)访问这个记录集的数据
CFieldExchange 这个类提供数据库和记录集对像之间的数据交换,只要是正在针对自定义数据库类型实现数据交换,就可以直接使用这个类
20.4 创建数据库应用程序
20.4.1 注册ODBC数据库
//烦,控制面板没有ODBC图标,没有啊,咱办啊,找到了,哈哈
20.4.2 生成MFC ODBC程序
Snapshot与Dynaset记录集
20.4.3 了解程序结构
文档类是一个标准类,只不过MFC Application Wizard添加了一个数据成员m_DBSampleSet,它是一个CProductSet类类型的对像,因此,在应用程序对像的InitInstance()函数成员中创建这个文档对像时,将自动创建记录集对像,这个程序与非数据库程序的重大区别表现在CRecordset类和CRectordView类的细节方面
1 了解记录集
查询数据库
数据库和记录集之间的数据传输
数据在数据库和记录集之间的传输是由CProductSet类的成员DoFieldExchange()完成'
2 了解记录视频图
3 创建视图对话框
4 将控件链接到记录集
DDX_FieldText()专门用于在视图和记录集之间交换数据Dialog Data Exchange(DDX,代表对话框数据交换)
在调用DDX_FieldText()函数时,必须提供四个参数
(1) CDataExchange对像确定数据传输的方向--传输到记录集中或者从记录集传输,只需提供作为DoDataExchange()函数的参数传递的指针
(2) 控件的ID,表示数据的来源或目的地
(3) 对CRecordset对象中字段数据成员的引用,表示数据的来源或目的地
(4) 指向与其交换数据的CRecordset对像的指针
DDX_FiledText(pDX, IDC_PRODUCTID, m_pSet->m_ProductID, m_pSet);
记录集类和记录视图类相互合作,支持数据在数据库和对话框中的控件之间的传输,
CProductSet类处理数据与数据库与其数据成员之间的传输,CProductView类处理数据在CProductSet类的数据成员和对话框中的控件之间的传输
20.5 对记录集进行排序
在从CRecordSet类继承的CProductSet类中,通过设置其m_strSort成员中的值将生成一个语句,在这个语句中可以添加ORDER BY子句,这将基于存储在m_strSort中的字符串对查询获得的输出表进行排序,只需要将m_strSort成员设置成一个字符串
修改窗口标题
20.6 使用另一个记录集对像
需要添加另一个记录集类,处理数据库的订单信息,并且要添加一个互补的视图类,显示记录集的一些字段,另外还需要在Products对话框中添加一个按钮,以便在需要查看当前产品的订单时,能够切换到Orders对话框,
20.6.2 添加记录集的视图类
1 创建对话框资源
2 创建记录视图类
3 定制记录集
(1) 添加过滤器到记录集中
将一个字符串赋给记录集对象的m_strFilter成员,就可以把过滤添加到查询中
需要在过滤器中设置两个条件,一个条件是限制记录集中生成的记录,它们在Orders表中的OrderID字段要等于Order Details 表中具有相同名称的字段
[Orders].[OrderID] = [Order Details].[OrderID]
m_pSet->m_strFilter = "[ProductID] = ? AND [Orders].[OrderID] = [Order Details].[OrderID]"
(2) 定义过滤器参数
添加一个数据成员到COrderSet类中,存储CProductSet对像的ProductID字段的当前值
(3) 初始化记录视图
对COrderView类中的OnInitialUpdate()函数实现重写,这个函数是在最初显示视图之前由MFC架构调用的
20.6.4 访问多个表视图
可以通过赋给应用程序中的每个记录视图窗口唯一的ID跟踪当前的窗口,目前在两个视图:产品视图和订单视图,要定义它们的ID,需要创建一个名称为OurConstants.h的新文件
1 切换视图
要支持视图切换机制,需要添加一个public函数成员到CMainFrame类中,其名称为SelectView(), 它的参数指定视图ID,这个函数将从当前视图切换到由这个作为参数传递的ID指定的视图
2 启用切换操作
3 处理视图的激活
在切换到已经存在的视图时,为了显示正确的信息,一定要刷新记录集和重新初始化对话框,在激活功者停用现有视图时,架构将调用COrderView类的OnActiveateView()成员,所以这是刷新记录集和对话框的一个合适的位置,
20.6.5 查看产品的订单
20.7 查看客户的详细情况
将要添加的基本机制将完成订单对话框上的另一个按钮控件,它将切换到一个有关客户数据的新对话框,除了显示客户数据的控件以外,还要在客户对话框中添加两个按钮,一个用于返回到Order View,另一个用于返回到Product View,此外的需要另一个对应于客户视图的视图ID
20.7.1 添加客户记录集
20.7.2 创建客户对话框资源
这个过程和创建订单对话框的过程完全相同
20.7.3 创建客户视图类
20.7.4 添加过滤器
在CCustomerView类的OnInitialUpdate()成员中定义过滤器,由于只希望返回一个对应于每个客户ID的记录,因此不必担心排序的问题,
OnActivateView()函数处理客户视图的激活,在CustomerView.cpp文件
20.7.5 实现过滤器参数
20.7.6 链接订单对话框和客户对话框
20.8 小结
1 MFC为访问数据库提供了OLE DB 和ODBC支持
2 要使用具有ODBC的数据库,必须注册数据库
3 数据库的连接由CDatabase或CDaoDatabase对象表示
4 记录集对象表示应用于一组已定义表的QL SELECT语句,如果必要的话,在创建记录集对象时,架构将自动创建表示数据库连接的数据库对像
5 通过记录集对象的m_strFilter数据成员,可以为记录集对象添加WHERE子句,
6 通过记录集的m_strSort数据成员,可以为记录集定义ORDER BY子句
7 记录视图对象用于显示记录集对象的内容
*/