当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第11章 > 例11-1 > 例1
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
下面我们来介绍数据库应用程序的创建
在此之前,我们要创建一个Access数据库的表
因为这个题目要求可以显示Access数据库表中的记录
好了!我们根据题目的要求,我们创建一个Access数据库的表
我们进入Access 创建一个
我们这个数据库的名字就叫My_ACCESS_DB,创建一个
那么 创建完 这里有一个空的表
在这儿我们单击添加
添加一个文本
字段一的名字,我们叫做作者
第二个也可以是文本
我们叫做出版社
再增加一个,比如说,货币型的数据,叫做价格
这里ID,我们要求系统自动给我们排
这时候,我们 比如说 为“作者”这个字段输入“作者A”
他的教材在清华大学出版社出版,价格的话,比如30元
作者B,也在清华大学出版社出版了一本教材,教材价格10块钱
作者C,在科技出版社出版了一个科技书籍,教材价格为20块钱
作者A,也在科技出版社出版了一个科技专著,可能15块钱
我们这里加几个内容
作者B,在地球出版社出版了一本地质构造类的书,这本书,比如说22块
那么我们看作者,这都是虚拟的数据,这个数据不是真实的数据
只是为了讲对数据库的调用问题
他在东方出版社出版了一本书,这本书非常贵,100块钱
这个作者A,也在海洋出版社,出版了一本书,80块钱
好了!我们现增加这几条记录,然后保存起来
表的名称我们也叫做My_ACCESS_DB,“确定”
这时候我们这里就出现了My_ACCESS_DB,给它关闭
那么我们在创建了数据库的表之后,我们开始编写应用程序
我们创建一个11_1的应用程序,在VC++里面吧,“确定”
我们选择单文档,一些暂时不要的内容去掉
在数据库支持的地方我们选择文件支持,提供文件支持的数据库视图
客户端的类型我们是ODBC连接,这里有一个绑定所有列,这个地方必须选上
因为我们刚才创建数据库的时候每个列都定义了一个列的名称
实际上它都有一个标识,所以我们要绑定所有列
在数据源的地方我们新建一个DNS
我们新建一个,们选择的是ACCESS DRIVER,“下一步”
我们的后缀选的是mdb,“下一步”
我们要保存这个位置 我们选择VC++上面 文件名叫My_ACCESS_DB
好了,就生成了My_ACCESS_DB下面DNS,"完成"
这时候我们就选择我们在VC++下面刚才已经创建好的数据库 确定
好了 这时候D下面VC++下面数据库已经创建,创建后我们按“确定”按钮
好了,“确定”,然后这时候再按“确定”
好了,确定了!确定后我们要选择这个表
这个表就是我们刚才创建的这个表
我们按“确定”,到这个时候我们数据源已经建立完成
我们已经建立好完成这个数据源了
我们“下一步”,这个最大化最小化都可以不要了
打印预览 Active X都可以不需要
好了, 我们“完成”,这个时候我们看到系统给生成了一些类
这个类里面比如view类、Application类、文档类、主窗口框架类还有Set类
我们“完成”,这里面会出一个安全警告 说所生成代码的连接字符串中可能包含明文密码
或者其他重要信息 请检查向导生成代码以获得详细信息
对于这个警告,我们不要管他,我们直接确定
我们这时候就生成了应用程序的一个最基本的框架
我们来看一下有一个类叫CRecordset类
为了能处理各种数据库最好要从类CRecordSet派生出一个子类来
然后数据库从数据源中读取数据后,可以做这些工作
比如说翻阅所有的信息,修改记录,设定锁定的状态
挑选有用的记录 给数据库排序以及给定参数,让数据库在正在运行的时候自动选择数据等等
我们在刚才生成的set类,我们看类的属性set类
set类里面 我们看这里就有一个CRecordset类
这时候我们就可以看到CRecordset类的定义
定义里面我们重点看几个,它在这里面定义了这么一些参数
一个是m_pDatabase 这是CDatabase类的一个指向CDatabase类对象的一个指针
然后这里是过滤器用来对这段内容进行过滤
这个是用来排序
这里有一些成员函数
比如说CanAppend,是可以增加新的内容
这个是滚动内容
这是更新,等等
这个IsOpen IsBOF, begin of file, end of file是数据库的起始位置、结束为止的判断
是否删除一条记录的判断,是否打开一个记录集,也就是一个表的判断
那么这里面是获取一个表中记录的个数,这么一个函数
然后这里面有生成了,比如说MoveNext、MovePrev、MoveFirst、MoveLast
这个就是,大家如果学习过数据库就知道这个是用来指向数据库的记录的
指向当前记录的下一条记录MoveNext,指向当前记录的上一条记录
指向整个数据库表的第一条记录和指向数据库表的最后一条记录
分别用MoveFirst、MoveLast,在这里面还有一些函数我在这里不细讲了
比如说这里还有一些虚拟函数,比如AddNew是在整个记录表的末尾增加新的记录
或者说开始编辑数据库表的记录
更新数据库表的记录以及删除当前的记录等等等等
这里面CRecordset类定义的内容对数据库操作的内容非常丰富
大家可以自己去看一下 我在这里就不细说了
这里面有几个变量,那么这个参数是m_hstmt,包含描述ODBC数据源的句柄
在调用Open函数之前,这个句柄是没有效的
我们再看这个变量m_pDatabase,这个是指向CDatabase对象的指针,是指向当前数据库打开的数据源
比如说strFilter,这个是在构造CRecordset类之后在调用Open函数之前
使用这个变量填写一个CString类的变量,它起的作用就是SQL语句的WHERE语句后面跟的那个条件
所以呢,就是过滤器,SQL语句后面WHERE内容实际上就是条件过滤器
所以这里面m_strFilter 大家从字面的单词就可以看出来它就是一个过滤器
这个strShort是在构造了Crecordset类之后
在调用Open函数之前
使用这个变量填写一个CString类的变量,它起的作用就像SQL语句的ORDER BY后面跟的条件语句
如果大家SQL语言比较熟悉的话 ORDER BY 就是排序
BY什么内容就是排序的条件
CRecordset类里面有很多成员函数,刚才已经给大家介绍了
那么在这里面,我再给大家介绍一下CDatabase类
它是在afxdb.h中定义,它的对象是用来连接一个数据源的
为了使用CDatabase对像,要调用构造函数
主要是调用OpenEx或是Open函数,这样会打开一个连接
当构造一个CDatabase类完成之后,可以向CRecordset类的对象
传递这个CDatabase类的指针
连接数据源结束时候,必须用Close函数关闭这个对象
CDatabase类的成员变量主要有m_hdbc
它保留了一个指向一个ODBC的数据源链接的句柄
关于CDatabase类的详细的内容请大家参看MSDN
CDatabase类有这些成员函数
我把主要的给大家说一下
Open函数是打开一个数据源 如果成果就返回一个非零值,表示true
否则返回零值,一般都是与throw函数合用
Close是关闭一个CDdatabase关联的数据源
CanTransact这是用来判断数据源是否支持事务处理
Transaction在数据库操作里面大家可能比较熟悉
就是数据库里面Transaction那一块的内容
Rollback是事务回滚,事务回滚是什么时候用呢?
大家如果学过数据库就会知道
当一个事务操作失败的时候,要回到先前状态
把操作失败的那个操作取消掉,所以事务回滚到上一次
也就是说回滚失败之前的正常的位置
再比如说IsOpen用来判断当前的对象是否连接着数据源等等
下面再介绍一个叫RFX
RFX是Record Field Exchange,是支持应用程序的一个交换机制
当从CRecordset类派生一个类的时候
在交换数据的时候如果没有选择大容量交换的方式
比如说Bulk RFX时 RFX机制将在数据交换中起作用
请大家分别注意一下RFX和大容量的交换Bulk RFX
我们通常说的RFX不是大容量交换
RFX在视图和数据源之间自动交换数据
由于一次交换的数据可能不止一个
为此可能要多次调用DoFieldExchange函数
同时他也是应用程序框架和ODBC交流的媒介
RFX机制能够安全的通过调用来保存用户的工作
比如说调用的是ODBC函数的SQLBindCol SQL绑定的列Bind
col是列 column的缩写
我们下面看一下我们代码中
工程文件自动生成的RFX代码
我们先来看,系统里面,在DoFieldExchange这个函数里面,给自动增加了这几个内容
RFX的构架内容,那么在这里面,系统生成的pFX是指向CFieldExchange对象的指针
指向的是outputColumn,输出列
我们看这里面自动的生成了
我们刚才定义了四个列名里面
第一个我们用系统缺省的,系统自动生成的行的编号
这个行的编号有个列,列有个ID,有个标识 叫m_ID
实际上后面我们在输出表里面我们增加了“作者”、“出版社”和“价格”三个列
分别系统称为“列1”、“列2”、“列3”
而且这里面已经做了绑定
也就是说列的名称跟我们的作者
这个列的名称跟出版社 column3是价格,在那里已经绑定了
已经跟列的名称绑定了
那么这里面就是说,实际上,这块内容是系统自动生成的
它是属于RFX机制
我们生成了这些内容后
实际上我们还不能够对数据库进行操作
我们不妨生成一下,看看是什么效果
好了!这个地方有一个提示错误,我们不管它,去掉!
注释掉就可以了
大家看我们编译成功后
实际上我们运行是看不到任何东西
所以我们下面要开始布局我们的对话框
我们在对话框里面,资源里面,开始布局对话框
比如说把对话框叫做
我们在这里面做一个布局,把这个先去掉
去掉之后我们按这个布局来完成
一个是书籍,是静态文本
我们再Caption里面叫做“书籍”
书籍弄完后安排一个编辑框
这个时候编辑框,既然有编辑框,就要给它设置它的相应的ID
系统缺省的是ID_EDITOR1, 缺省的就可以用了
然后我们再弄一个编辑框叫EDITOR2
再来一个叫EDITOR3,再来一个叫EDITOR4
我们安排了四个编辑框,给它拉大一点
这里面我们 比如说叫做“书籍ID”
我们安排第二个叫“作者”
第三个我们叫“出版社”, 第四个叫“价格”
界面安排对齐一下,漂亮一点
对话框安排紧凑一点,保存一下
我们在安排好界面后,看一下函数DoFieldExchange是RFX机制的中枢
任何时候应用框架需要从数据源到数据库或是从数据库到数据源
都要调用DoFieldExchange函数
下面是CRecordset派生类的头文件
在头文件里面大家可以看到这四个列的数据类型
都给大家定义好了,系统自动地根据我们的操作给予定义
在这里定义了,在set类定义的头文件里面看到这里有一个虚拟函数DoFieldExchange
这里面实际上提供了RFX的支持
我们再回过头看一下在RecordView里面
在这个view的定义文件里面
在这里面DoDataExchange这个地方
实际上我们要在这里面要加入对对话框的关联
所以我们加入这些代码
就是说在DoDataExchange函数里面加入这些代码
这样是将对话框中的编辑框控件与数据库中的字段关联起来
那么我们在这里面增加这些代码
增加完这些代码的目的就是
这个是第一个编辑框,实际上就把第一个编辑框跟数据库表中的第一列关联
第二个编辑框就跟第二列关联
第三个编辑框跟第三列关联
第四个编辑框就跟第四列关联
我们就给它关联起来了
我们现在编译一下应用程序
在刚刚加入了这几行代码之后
我们就实现了对话框中这个编辑框与数据库中的字段的关联
关联后这些代码,这几块,这几句代码就实现了它的关联
关联之后我们现在可以生成应用程序
好!我们生成应用程序
好了,这应用程序,我们这里可以关掉这个地方
可以生成它,显示的第一条记录
这是没有任何问题的
我们刚才执行的应用程序
接着我们再给大家介绍一个异常的问题,叫做CDBException这个类
CDBException类是用来处理从其它ODBC类传过来的异常情况的
这个类一般是和关键词CATCH连用的
同样的用户也可以用全局函数AfcThrowDBException抛出一个异常情况
CDBException类主要有这些成员变量
比如说m_nRetCode,它包含了一个结构体RETCODE
里面包含了ODBC的错误信息的描述
有了错误信息的描述
大家遇到错误信息的时候就知道怎么处理了
还有strError包含一个描述异常情况的字符串
还有m_strStateNativeOrigin 这是
如果变量包含多个错误的描述,错误就会分行显示
-讨论实录
--0-0
-6-1 MFC概述
-6-2 C++的基本知识
--6-2-1 类
--6-2-2 对象
--6-2-6 重载
--6-2-9 指针
-6-3 MFC类的组织结构及主要的类的简介
--6-3-2 根类
-6-4 MFC中全局函数和全局变量
-7-1 概述
--7-1-1
--7-1-2
-7-2 按钮控件及其应用
--128B12447816EEF99C33DC5901307461
-7-3 按钮控件及其应用
--7-3
-7-4 静态控件
--7-4
-7-5 列表框控件
--7-5-1
--7-5-2
-7-6 编辑框控件
--7-6
-7-7 组合框控件
--7-7
-7-8 对话框通用控件
--7-8-1
--7-8-2
-讲义源代码
--html
-8-1&2 资源的应用以及菜单资源的使用
--8-1-1
--8-1-2
-8-3 快捷菜单的创建及其应用
--8-3
-8-4 加速键资源的创建及其使用
--8-4
-8-5 工具条资源的创建及其使用
--8-5
-8-6 字符串资源的使用
--8-6
-8-7 位图资源的创建及其使用
--8-7
-课堂示例源代码
--html
-第一次作业内容及要求
--html
--第一次作业及答题链接--作业
-9-1 概述
--9-1
-9-2 Doc/View框架的主要成员
--Video
-9-3 文档操作中的一些重要概念
--Video
-9-4 SDI编程实例
--Video
-9-5 MDI编程实例
--9-5-1
--9-5-2
-课堂示例源代码
--html
-第二次作业内容及要求
--html
--第二次作业及答题链接--作业
-10-1 利用音频函数实现多媒体程序设计
--10-1-1
--10-1-2
--10-1-3
--10-1-4
-10-2 利用Windows Media Player控件实现多媒体程序设计
--10-2
-课堂示例源代码
--html
-例11-1
--例1
-例11-2
--例11-2
-例11-3
--例11-3
-例11-4
--例11-4
-11-1 ODBC介绍与引用
--11-1
-课堂示例源代码
--html
-第三次作业及答题链接