VC++课件第11讲数据库编程

上传人:E**** 文档编号:91267715 上传时间:2019-06-27 格式:PPT 页数:44 大小:325.50KB
返回 下载 相关 举报
VC++课件第11讲数据库编程_第1页
第1页 / 共44页
VC++课件第11讲数据库编程_第2页
第2页 / 共44页
VC++课件第11讲数据库编程_第3页
第3页 / 共44页
VC++课件第11讲数据库编程_第4页
第4页 / 共44页
VC++课件第11讲数据库编程_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《VC++课件第11讲数据库编程》由会员分享,可在线阅读,更多相关《VC++课件第11讲数据库编程(44页珍藏版)》请在金锄头文库上搜索。

1、1,第11章 数据库应用程序的开发,杨琦 计算机教学实验中心 西安交通大学,2,11.1有关数据库的基础知识,现有的数据库软件有很多,如大型数据库Oracle、SQL Server,小数据库Access等,都支持关系模型,数据库模型,层次模型 网状模型 关系模型 面向对象模型,3,使用DAO访问数据库,DAO提供了与ODBC功能相似的MFC类,主要包括: CDaoDatabase CDaoRecordset CDaoRecordView CDaoDBException,4,CDaoDatabase常用函数,5,CDaoDatabase常用函数,6,CDaoRecordset记录集类,7,记录集

2、导航操作,8,其他记录集操作,9,重载函数,10,CDaoRecordView可视记录集类,11,CDaoTableDef表结构定义类,12,11.2 ODBC介绍和引用 11.2.1 ODBC简介,MS推出了Open Database Connectivity,简称ODBC。它包含访问不同数据库所要求的ODBC驱动程序。只要调用ODBC所支持的函数,动态链接到不同的驱动程序上即可。 一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是Oracle、SQL Server还是Access数据库

3、,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。,13,ODBC数据源控制台就是Windows系统管理数据源的控制台,所有的数据库驱动,以及数据源登记都要在此发布,并向系统发出请求。 通过使用ODBC API 和MFC ODBC 类, 可以访问任何数据资源。只要应用程序的用户的终端机器上面有ODBC的驱动,都可以访问任何地方的数据源。 ODBC是种接口,它是通过相应的各个数据库的ODBC驱动来访问各种数据库中的数据。使用ODBC,能够使应用程序独立于数据库的硬件环境,ODBC提供的API函数独立于数据库管理系统。,14,ODBC 是Microso

4、ft的Windows系统下的数据库服务的一部分。它是由下面几个部分构成的: ODBC API :包含在一个动态库中的函数集合、一个错误代码的集合、一个标准的SQL语句集合,用来调用DBMS中的数据。 ODBC Driver Manager:一个动态库文件(ODBC32.DLL) 来加载ODBC驱动,这个DLL是对你的应用程序是透明的。 ODBC database drivers:由一个或是多个DLL构成,其中含有ODBC API,这些DLL由其拥有者DBMS调用。 ODBC Cursor Library: 这也是一个动态连接库文件。 ODBC Administrator :这是一个ODBC控制

5、台,用来管理不同的数据源。,15,11.2.2 MFC对ODBC的封装,16,11.2.3 如何访问数据库,建立ODBC数据源 连接数据源 选择和处理记录 数据库应用程序中的文档和视图,访问数据库,17,11.2.4 在数据库应用程序中常用的几个类,1 CRecordView类,一个CRecordView对象就是用一个视图中的控件来显示数据库中的记录。CRecordView类使用了动态数据交换(DDX)和数据库交换(RFX),在视图上的控件和数据源中的数据库中进行数据交换。 AppWizard 生成CRecordView和CRecordset类,并和相应的数据源关联。,18,【例11-1】创建

6、一个数据库应用程序,可以显示Access数据库表中的记录。,19,步骤:,1. 用AppWizard来生成一个单文档的ODBC工程文件,20,选择已创建好的数据库My_Access_db.mdb表单,21,用ClassWizard给相应的Edit Box连接变量,注意,在Add Member Variable 对话框中的下拉组合框中已经有了相应表中的字段,只要选中相应的字段就可以了,22,为了能够处理各种的数据库,最好从类CRecordset派生出一个子类来。数据库从数据源读取数据后,可以做以下的工作: 翻阅所有的记录。 修改记录,设定锁定状态。 挑选有用的记录。 给数据库排序。 给定参数,让

7、数据库在运行的时候自动选择数据。,2 CRecordset类,23,3 CDatabase类,CDatabase在afxdb.h中定义。其对象是用来连接一个数据源的。 为了使用CDatabase对象,需调用构造函数,并调用OpenEx或是Open函数,这将会打开一个连接。 当构造一个CDatabase类完成后,可以向CRecordset类的对象传递这个CDatabase类的指针。连接数据源结束时,必须用Close函数关闭这个对象。,3 CDatabase类,24,4 RFX,RFX (Record Field Exchange)是支持应用程序的一个交换机制,当从CRecordset 类派生一个

8、类,在交换数据的时候没有选择大容量交换的方式(Bulk RFX)时,RFX机制将在数据交换中起作用。 RFX 在视图和数据源之间自动交换数据,由于一次交换的数据可能不止一个,为此可能要多次调用DoFieldExchange 函数,同时它也是应用程序框架和ODBC交流的媒介。 RFX机制能够安全的通过调用(例如ODBC 函数SQLBindCol)来保存用户的工作。,4 RFX,25,下面代码就是【例11-1】工程文件中AppWizard自动加入的RFX代码,见粗斜体部分: void CODBCSet:DoFieldExchange(CFieldExchange* pFX) /AFX_FIELD_

9、MAP(CODBCSet) pFX-SetFieldType(CFieldExchange:outputColumn); RFX_Long(pFX, _T(“书籍ID“), m_ID); RFX_Text(pFX, _T(“作者“), m_column1); RFX_Text(pFX, _T(“出版社“), m_column2); RFX_Text(pFX, _T(“价格“), m_column3); /AFX_FIELD_MAP ,26,函数DoFieldExchange 是RFX机制的中枢,任何时候应用框架需要从数据源到数据库或是从数据库到数据源,都要调用DoFieldExchange 函

10、数。 下面是CRecordset派生类的头文件,其中关于RFX机制的部分已经用粗斜体显示: class CODBCSet : public CRecordset / Field/Param Data /AFX_FIELD(CODBCSet, CRecordset) long m_ID; CString m_column1; CString m_column2; CString m_column3; /AFX_FIELD / Overrides / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CODBCSet) pu

11、blic: virtual void DoFieldExchange(CFieldExchange* pFX); / RFX support /AFX_VIRTUAL ;,27,5 CDBException,CDBException是用来处理从其它ODBC类传过来的异常情况的。这个类一般是和关键字CATCH连用的。同样的用户也可以用全局函数AfxThrowDBException抛出一个异常情况,m_nRetCode:它包含了一个结构体RETCODE ,里面包含了ODBC的错误信息的描述。 m_strError:包含一个描叙异常情况的字符串。 m_strStateNativeOrigin:包含描

12、述异常情况的字符串 m_strStateNativeOrigin;如果变量包含多个错误的描述,错误会分行显示。,CDBException类的成员变量,5 CDBException,28,【例11-2】在【例11-1】的基础上增加“删除一个记录”、“更新记录”和“清除域”三个菜单项,并实现相应的操作。,响应COMMAND命令,响应命令UPDATE_COMMAND_UI,1 加入菜单项,29,2 重载OnMove函数,30,BOOL CODBCView:OnMove(UINT nIDMoveCommand) switch(nIDMoveCommand) case ID_RECORD_PREV: m

13、_pSet-MovePrev(); if(!m_pSet-IsBOF() break; /如果移到数据库的开始,自动执行MoveFirst函数 case ID_RECORD_FIRST: m_pSet-MoveFirst(); break; case ID_RECORD_NEXT: m_pSet-MoveNext(); if(!m_pSet-IsEOF() break; if(!m_pSet-CanScroll() m_pSet-SetFieldNull(NULL); /清空屏幕 break; case ID_RECORD_LAST: m_pSet-MoveLast(); break; def

14、ault: ASSERT(FALSE); /异常情况 UpdateData(FALSE); /交换数据 return TRUE; ,31,3 添加菜单响应函数,void CODBCView:OnDeleteRecord() /删除记录 CRecordsetStatus m_cStatus; try m_pSet-Delete(); catch(CDBException* m_pEx) AfxMessageBox(m_pEx-m_strError); m_pEx-Delete(); m_pSet-MoveFirst();/若失败,将记录指针移到首记录 UpdateData(FALSE); ret

15、urn; m_pSet-GetStatus(m_cStatus); if(m_cStatus.m_lCurrentRecord=0) m_pSet-MoveFirst(); /删除了最后一个记录 else m_pSet-MoveNext(); UpdateData(FALSE); ,32,void CODBCView:OnUpdateDeleteRecord(CCmdUI* pCmdUI) /删除后的刷新 pCmdUI-Enable(!m_pSet-IsEOF(); void CODBCView:OnUpdateRecord() m_pSet-Edit(); UpdateData(TRUE);

16、 if(m_pSet-CanUpdate() m_pSet-Update(); ,33,void CODBCView:OnUpdateUpdateRecord(CCmdUI* pCmdUI) /刷新记录集 pCmdUI-Enable(!m_pSet-IsEOF(); void CODBCView:OnClearDomain() /清除域 m_pSet-SetFieldNull(NULL); UpdateData(FALSE); ,34,【例11-3】在【例11-2】的基础上增加功能,使得程序能够向数据库中添加新记录。,增加一个菜单项“增加一个新记录”,其ID标识为ID_ADD_RECORD,35,在数据库中增加记录步骤: 得到最后一条记录的ID号 将其加1 通过AddNew函数来添加记录 把新的ID值设置为新增记录中的ID字段值 用Update函数保存新记录

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号