《第13章-数据库应用程序的开发PPT参考课件.ppt》由会员分享,可在线阅读,更多相关《第13章-数据库应用程序的开发PPT参考课件.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1第第13章章 数据库应用程序的开发数据库应用程序的开发 213.1有关数据库的基础知识有关数据库的基础知识 现有的数据库软件有很多,如大型数据库现有的数据库软件有很多,如大型数据库Oracle、SQL Server,小数据库,小数据库Access等,等,都支持关系模型都支持关系模型数据库数据库模型模型层次模型层次模型网状模型网状模型关系模型关系模型面向对象模型面向对象模型313.2 ODBC介绍和引用介绍和引用 413.2.1 ODBC简介简介 MSMS推推出出了了Open Open Database Database ConnectivityConnectivity,简简称称ODBCODB
2、C。它它包包含含访访问问不不同同数数据据库库所所要要求求的的ODBCODBC驱驱动动程程序序。只只要要调调用用ODBCODBC所所支支持持的的函函数数,动态链接到不同的驱动程序上即可。动态链接到不同的驱动程序上即可。一一个个基基于于ODBCODBC的的应应用用程程序序对对数数据据库库的的操操作作不不依依赖赖任任何何DBMSDBMS,不不直直接接与与DBMSDBMS打打交交道道,所所有有的的数数据据库库操操作作由由对对应应的的DBMSDBMS的的ODBCODBC驱驱动动程程序序完完成成。也也就就是是说说,不不论论是是OracleOracle、SQL SQL ServerServer还还是是Acc
3、essAccess数数据据库库,均均可可用用ODBC ODBC APIAPI进进行行访访问问。由由此此可可见见,ODBCODBC的的最最大大优优点点是是能能以以统统一一的的方方式式处理所有的数据库。处理所有的数据库。5 ODBC数数据据源源控控制制台台就就是是Windows系系统统管管理理数数据据源源的的控控制制台台,所所有有的的数数据据库库驱驱动动,以以及及数数据据源源登登记记都都要要在在此此发发布布,并并向向系系统统发发出出请请求。求。通通过过使使用用ODBC API 和和MFC ODBC 类类,可可以以访访问问任任何何数数据据资资源源。只只要要应应用用程程序序的的用用户户的的终终端端机机
4、器器上上有有ODBC的的驱驱动动,都都可可以以访访问问任任何何地地方的数据源。方的数据源。ODBC是一种接口,它是通过相应的各个是一种接口,它是通过相应的各个数据库的数据库的ODBC驱动来访问各种数据库中的数驱动来访问各种数据库中的数据。使用据。使用ODBC,能够使应用程序独立于数据,能够使应用程序独立于数据库的硬件环境,库的硬件环境,ODBC提供的提供的API函数独立于函数独立于数据库管理系统。数据库管理系统。6ODBC 是是Microsoft的的Windows系系统统下下的的数数据据库库服服务务的的一一部分。它是由下面几个部分构成的:部分。它是由下面几个部分构成的:ODBC API:包包含
5、含在在一一个个动动态态库库中中的的函函数数集集合合、一一个个错错误误代代码码的的集集合合、一一个个标标准准的的SQL语语句句集集合合,用用来来调用调用DBMS中的数据。中的数据。ODBC Driver Manager:一一个个动动态态库库文文件件(ODBC32.DLL)来来加加载载ODBC驱驱动动,这这个个DLL对对你你的的应应用用程程序序是是透透明明的。的。ODBC database drivers:由由一一个个或或是是多多个个DLL构构成成,其中含有其中含有ODBC API,这些,这些DLL由其拥有者由其拥有者DBMS调用。调用。ODBC Cursor Library:这也是一个动态连接库
6、文件。这也是一个动态连接库文件。ODBC Administrator:这是一个:这是一个ODBC控制台,用来控制台,用来管理不同的数据源。管理不同的数据源。713.2.2 MFC对对ODBC的封装的封装 813.2.3 如何访问数据库如何访问数据库 建立建立ODBC数据源数据源 连接数据源连接数据源 选择和处理记录选择和处理记录 数据库应用程序中的文档和视图数据库应用程序中的文档和视图 访问数访问数据库据库913.2.4 在数据库应用程序中常在数据库应用程序中常用的几个类用的几个类 1 CRecordView类类 一个一个CRecordView对象就是用一个视图对象就是用一个视图中的控件来显示
7、数据库中的记录。中的控件来显示数据库中的记录。CRecordView类使用了动态数据交换类使用了动态数据交换(DDX)和数据库交换()和数据库交换(RFX),在视图上),在视图上的控件和数据源中的数据库中进行数据交的控件和数据源中的数据库中进行数据交换。换。AppWizard 生成生成CRecordView和和CRecordset类,类,并和相应的数据源关联。并和相应的数据源关联。10【例例13-113-1】创创建建一一个个数数据据库库应应用用程程序序,可可以显示以显示AccessAccess数据库表中的记录。数据库表中的记录。11步骤:步骤:1.用用AppWizard来生成一个单文档的来生成
8、一个单文档的ODBC工程文件工程文件 12选择已创建选择已创建好的数据库好的数据库My_Access_db.mdb表单表单 13用用ClassWizard给相应的给相应的Edit Box连接变量,连接变量,注意,在注意,在Add Member Variable 对话框中的对话框中的下拉组合框中已经有了相应表中的字段,下拉组合框中已经有了相应表中的字段,只要选中相应的字段就可以了只要选中相应的字段就可以了 142 CRecordset类类 为了能够处理各种的数据库,最好从类为了能够处理各种的数据库,最好从类CRecordset派生出一个子类来。数据库从派生出一个子类来。数据库从数据源读取数据后,
9、可以做以下的工作:数据源读取数据后,可以做以下的工作:翻阅所有的记录。翻阅所有的记录。修改记录,设定锁定状态。修改记录,设定锁定状态。挑选有用的记录。挑选有用的记录。给数据库排序。给数据库排序。给给定定参参数数,让让数数据据库库在在运运行行的的时时候候自自动动选择数据。选择数据。153 CDatabase类类 CDatabase在在afxdb.h中定义。其对象是用来中定义。其对象是用来连接一个数据源的。连接一个数据源的。为了使用为了使用CDatabase对象,需调用构造函数,对象,需调用构造函数,并调用并调用OpenEx或是或是Open函数,这将会打开一函数,这将会打开一个连接。个连接。当构造
10、一个当构造一个CDatabase类完成后,可以向类完成后,可以向CRecordset类的对象传递这个类的对象传递这个CDatabase类的类的指针。连接数据源结束时,必须用指针。连接数据源结束时,必须用Close函数函数关闭这个对象。关闭这个对象。164 RFX RFX(Record Field Exchange)是支持应用程序的是支持应用程序的一个交换机制,当从一个交换机制,当从CRecordset 类派生一个类,类派生一个类,在交换数据的时候没有选择大容量交换的方在交换数据的时候没有选择大容量交换的方式(式(Bulk RFX)时,)时,RFX机制将在数据交换中机制将在数据交换中起作用。起作
11、用。RFX 在视图和数据源之间自动交换数据,由在视图和数据源之间自动交换数据,由于一次交换的数据可能不止一个,为此可能于一次交换的数据可能不止一个,为此可能要多次调用要多次调用DoFieldExchange 函数,同时它也函数,同时它也是应用程序框架和是应用程序框架和ODBC交流的媒介。交流的媒介。RFX机制能够安全的通过调用机制能够安全的通过调用(例如例如ODBC 函函数数SQLBindCol)来保存用户的工作。来保存用户的工作。17下面代码就是下面代码就是【例例13-1】工程文件中工程文件中AppWizard自动自动加入的加入的RFX代码,见代码,见粗斜体粗斜体部分:部分:void COD
12、BCSet:DoFieldExchange(CFieldExchange*pFX)/AFX_FIELD_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 18函数函数DoFieldExchange 是是RFX机制的中枢,任何时候应用机制的中
13、枢,任何时候应用框架需要从数据源到数据库或是从数据库到数据源,框架需要从数据源到数据库或是从数据库到数据源,都要调用都要调用DoFieldExchange 函数。函数。下面是下面是CRecordset派生类的头文件,其中关于派生类的头文件,其中关于RFX机机制的部分已经用制的部分已经用粗斜体粗斜体显示:显示:class CODBCSet:public CRecordset /Field/Param Data/AFX_FIELD(CODBCSet,CRecordset)longm_ID;CStringm_column1;CStringm_column2;CStringm_column3;/AFX
14、_FIELD/Overrides/ClassWizard generated virtual function overrides/AFX_VIRTUAL(CODBCSet)public:virtualvoidDoFieldExchange(CFieldExchange*pFX);/RFXsupport/AFX_VIRTUAL ;195 CDBException CDBException是用来处理从其它是用来处理从其它ODBC类传类传过来的异常情况的。这个类一般是和关键字过来的异常情况的。这个类一般是和关键字CATCH连用的。同样的用户也可以用全局函连用的。同样的用户也可以用全局函数数AfxT
15、hrowDBException抛出一个异常情况抛出一个异常情况 m_nRetCode:它包含了一个结构体它包含了一个结构体RETCODE,里面,里面包含了包含了ODBC的错误信息的描述。的错误信息的描述。m_strError:包含一个描叙异常情况的字符串。包含一个描叙异常情况的字符串。m_strStateNativeOrigin:包含描述异常情况的字符串包含描述异常情况的字符串m_strStateNativeOrigin;如果变量包含多个错误的描;如果变量包含多个错误的描述,错误会分行显示。述,错误会分行显示。CDBException类类的成员变量的成员变量 20【例例13-2】在在【例例13
16、-1】的基础上增加的基础上增加“删除一删除一个记录个记录”、“更新记录更新记录”和和“清除域清除域”三个菜三个菜单项,并实现相应的操作。单项,并实现相应的操作。响应响应COMMAND命令命令响应命令响应命令UPDATE_COMMAND_UI1 加入菜单项加入菜单项 212 重载重载OnMove函数函数 22BOOL CODBCView:OnMove(UINT nIDMoveCommand)switch(nIDMoveCommand)caseID_RECORD_PREV:m_pSet-MovePrev();if(!m_pSet-IsBOF()break;/如果移到数据库的开始,自动执行如果移到数
17、据库的开始,自动执行MoveFirst函数函数caseID_RECORD_FIRST:m_pSet-MoveFirst();break;caseID_RECORD_NEXT:m_pSet-MoveNext();if(!m_pSet-IsEOF()break;if(!m_pSet-CanScroll()m_pSet-SetFieldNull(NULL);/清空屏幕清空屏幕break;caseID_RECORD_LAST:m_pSet-MoveLast();break;default:ASSERT(FALSE);/异常情况异常情况UpdateData(FALSE);/交换数据交换数据returnT
18、RUE;233 添加菜单响应函数添加菜单响应函数 void CODBCView:OnDeleteRecord()/删除记录删除记录CRecordsetStatusm_cStatus;trym_pSet-Delete();catch(CDBException*m_pEx)AfxMessageBox(m_pEx-m_strError);m_pEx-Delete();m_pSet-MoveFirst();/若失败,将记录指针移到首记录若失败,将记录指针移到首记录UpdateData(FALSE);return;m_pSet-GetStatus(m_cStatus);if(m_cStatus.m_lC
19、urrentRecord=0)m_pSet-MoveFirst();/删除了最后一个记录删除了最后一个记录elsem_pSet-MoveNext();UpdateData(FALSE);24void CODBCView:OnUpdateDeleteRecord(CCmdUI*pCmdUI)/删除后的刷新删除后的刷新 pCmdUI-Enable(!m_pSet-IsEOF();void CODBCView:OnUpdateRecord()m_pSet-Edit();UpdateData(TRUE);if(m_pSet-CanUpdate()m_pSet-Update();25void CODBC
20、View:OnUpdateUpdateRecord(CCmdUI*pCmdUI)/刷新记录集刷新记录集pCmdUI-Enable(!m_pSet-IsEOF();void CODBCView:OnClearDomain()/清除域清除域m_pSet-SetFieldNull(NULL);UpdateData(FALSE);26【例例13-313-3】在在【例例13-213-2】的的基基础础上上增增加加功功能能,使得程序能够向数据库中添加新记录。使得程序能够向数据库中添加新记录。增加一个菜单项增加一个菜单项“增加增加一个新记录一个新记录”,其,其ID标标识为识为ID_ADD_RECORD 27在
21、数据库中增加记录步骤:在数据库中增加记录步骤:得到最后一条记录的得到最后一条记录的IDID号号将其加将其加1 1通过通过AddNewAddNew函数来添加记录函数来添加记录把新的把新的IDID值设置为新增记录中的值设置为新增记录中的IDID字段值字段值用用UpdateUpdate函数保存新记录函数保存新记录调用调用RequeryRequery函数更新记录函数更新记录把输入控制滚动到数据库中的最后一条记录上把输入控制滚动到数据库中的最后一条记录上28 为了计算新的为了计算新的ID号,需增加号,需增加CODBCSet类类的成员函数的成员函数GetMaxID long CODBCSet:GetMax
22、ID()MoveLast();/移到最后一条记录移到最后一条记录returnm_ID;/返回该返回该ID值值29void CODBCView:OnAddRecord()CRecordset*pSet=OnGetRecordset();/获取指向数据库的指针获取指向数据库的指针if(pSet-CanUpdate()&!pSet-IsDeleted()/确认对数据库的任何修改均已保存确认对数据库的任何修改均已保存pSet-Edit();if(!UpdateData()return;pSet-Update();longm_lNewID=m_pSet-GetMaxID()+1;/获取新的获取新的ID值
23、值m_pSet-AddNew();/添加一个新记录添加一个新记录m_pSet-m_ID=m_lNewID;/设置新的设置新的ID标识标识m_pSet-Update();/保存新的记录保存新的记录m_pSet-Requery();/刷新数据库刷新数据库m_pSet-MoveLast();/游标移到最后一条记录游标移到最后一条记录UpdateData(FALSE);/更新表单更新表单 30【例例13-413-4】在在【例例13-313-3】的的基基础础上上增增加加浏浏览览记记录的功能和对记录进行排序的功能。录的功能和对记录进行排序的功能。创创建建对对话话框框,通通过过在在对对话话框框中中指指定定记
24、记录录序序号号(记记录录序序号号不不是是记记录录的的IDID号号标标识识)来来浏浏览览该该条条记录记录的内容。的内容。IDD_MOVE_RECORDIDC_RECORD_ID31void CODBCView:OnMoveToRecord()CMoveToRecorddlgMoveTo;/创建创建CMoveToRecord类的对象实例类的对象实例if(dlgMoveTo.DoModal()=IDOK)CRecordset*pSet=OnGetRecordset();/指向数据库记录的指针指向数据库记录的指针if(pSet-CanUpdate()&!pSet-IsDeleted()/所所有有的的修
25、修改改保保存存否否?pSet-Edit();if(!UpdateData()return;pSet-Update();pSet-SetAbsolutePosition(dlgMoveTo.m_RecordID);/设置新的位置设置新的位置UpdateData(FALSE);/更新表单更新表单32由由于于在在视视图图中中响响应应了了对对话话框框的的操操作作,因因此此,还还需需要要在在ODBCView类类的的实实现现文文件件ODBCView.cpp中加入定义对话框类的头文件:中加入定义对话框类的头文件:#includeMoveToRecord.h 同样,为了使用工具栏按钮进行快速操作,同样,为了使
26、用工具栏按钮进行快速操作,在工具栏中定义一个在工具栏中定义一个Move按钮,其按钮,其ID与菜单与菜单项项“移到第移到第条记录条记录”的的ID一致,一致,Move按钮的按钮的ID为为ID_MoveToRecord。33由由于于CRecordset类类的的对对象象或或从从CRecordset类类继继承承的的对对象象都都拥拥有有一一个个m_strSort成成员员,它它决决定定了了对对记记录录的的排排序序,在在“记记录录”菜菜单单中中增增加加菜菜单单项项“按按价价格格排排序序”,(ID_SORT_PRICE),并并为为它它映映射射COMMAND消消息息处处理理函函数数OnSortPrice()。vo
27、id CODBCView:OnSortPrice()m_pSet-Close();/关闭数据库关闭数据库m_pSet-m_strSort=“价格价格”;/指定排序字段指定排序字段m_pSet-Open();/再次打开数据库再次打开数据库UpdateData(FALSE);/更新已经排序过的记录更新已经排序过的记录由由于于用用了了CRecordset类类的的成成员员m_strSort,因因此此对对数数据据库库记录的排序不用进行太多的代码干预。记录的排序不用进行太多的代码干预。最后在工具栏中增加最后在工具栏中增加Sort工具按钮,实现菜单项工具按钮,实现菜单项“按价按价格排序格排序”的功能。的功能
28、。34【例例13-5】在在【例例13-4】的基础上增加查询功能的基础上增加查询功能 为了编写查找功能的代码,增加菜单项为了编写查找功能的代码,增加菜单项“按按作者查找作者查找”(ID_Search),映射的,映射的COMMAND消息消息处理函数为处理函数为OnSearch()。假设按假设按“作者作者”字段进行查询,为菜单项字段进行查询,为菜单项“按按作者查找作者查找”所映射的所映射的COMMAND消息处理函数代消息处理函数代码如下:码如下:void CODBCView:OnSearch()DoFilter(作者作者);35void CODBCView:DoFilter(CString col)
29、CSearchDlgdlg;intresult=dlg.DoModal();if(result=IDOK)CStringstr=col+=+dlg.m_Edit_Search+;/接收查询字符串接收查询字符串m_pSet-Close();/关闭原来的表单关闭原来的表单m_pSet-m_strFilter=str;/将查询条件赋给过滤器将查询条件赋给过滤器m_pSet-Open();/打开经过过滤的表单打开经过过滤的表单intrecCount=m_pSet-GetRecordCount();/计算满足条件的记录数计算满足条件的记录数36if(recCount=0)/如果没有找到相关记录如果没有找
30、到相关记录MessageBox(“Nomatchingrecords.”);m_pSet-Close();/关闭表单关闭表单m_pSet-m_strFilter;/将过滤结果给过滤器将过滤结果给过滤器m_pSet-Open();/据过滤结果打开表单据过滤结果打开表单(什么都没找到)什么都没找到)UpdateData(FALSE);/不论任何情况,都更新表单不论任何情况,都更新表单由由于于上上述述代代码码都都是是在在ODBCView.cpp中中,即即上上述述操操作作是是在在视视图图中中完完成成的的,但但查查询询条条件件是是在在“查查询询”对对话话框框中中输输入入的的,在在视视图图中中接接收收了了对对话话框框的的输输入入内内容容,因因此此,需需要在要在ODBCView.cpp中加入如下代码:中加入如下代码:#includeSearchDlg.h