《MFC数据库编程及其应用.ppt》由会员分享,可在线阅读,更多相关《MFC数据库编程及其应用.ppt(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第7 7章章 MFCMFC数据库编程及其应用数据库编程及其应用 l重点重点 1.1.数据库系统和数据库系统和ODBCODBC 2.CRecordSet2.CRecordSet的应用的应用 3.3.示例系统中数据库操作类的设计示例系统中数据库操作类的设计2010年10月1重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋7.1 7.1 数据库系统的基本概念数据库系统的基本概念数据库系统由数据库、数据库管理系统和数据库应用系数据库系统由数据库、数据库管理系统和数据库应用系统统3 3部分组成,如右图:部分组成,如右图:数据库是数据的集合,由一个或多个表组成,一般将表数据库是数据的集合,由一个
2、或多个表组成,一般将表中的一行称作记录中的一行称作记录(record)(record)或行或行(row)(row),将表的列称作字,将表的列称作字段段(field)(field)或列或列(column)(column);数据库应用程序是在数据库管理系统数据库应用程序是在数据库管理系统(DBMS)(DBMS)的支持下对数据库中的数据进行的支持下对数据库中的数据进行加工、处理的程序,加工、处理的程序,MFCMFC提供了两种支持:提供了两种支持:ODBCODBC和和DAODAO。数据库系统的组成数据库系统的组成数据库管理系统是一套程序,用来定义、管理和处理数据库与应用程序之间的联系,数据库管理系统是
3、一套程序,用来定义、管理和处理数据库与应用程序之间的联系,例如,例如,FoxProFoxPro、AccessAccess等;等;不同的数据库在实现它的数据库管理系统时都有一些不同的特性,因而使得用某个数不同的数据库在实现它的数据库管理系统时都有一些不同的特性,因而使得用某个数据库管理系统开发的数据库应用系统无法在其他数据库管理系统上使用;据库管理系统开发的数据库应用系统无法在其他数据库管理系统上使用;为了使一个数据库应用系统能够适用于所有的数据库管理系统,人们在数据库应用系为了使一个数据库应用系统能够适用于所有的数据库管理系统,人们在数据库应用系统和数据库管理系统之间增加了一个符合某种规范的标
4、准接口,从而使得按照标准接统和数据库管理系统之间增加了一个符合某种规范的标准接口,从而使得按照标准接口设计的数据库应用系统可以访问所有支持标准接口的数据库管理系统。常用的标准口设计的数据库应用系统可以访问所有支持标准接口的数据库管理系统。常用的标准接口有接口有ODBCODBC、DAODAO、JDBCJDBC等,他们之间的关系如图所示:等,他们之间的关系如图所示:SQL(StructuredSQL(Structured Query Language Query Language,结构化查询语言,结构化查询语言)最早由最早由IBMIBM提出,是专门用来处理提出,是专门用来处理关系数据库的基于文本的
5、语言。关系数据库的基于文本的语言。SQLSQL向数据库提供了完善而一致的接口,它不是独立的向数据库提供了完善而一致的接口,它不是独立的计算机语言,需要计算机语言,需要DBMSDBMS的支持才能执行。的支持才能执行。SQLSQL是一种标准的数据库语言,目前大多数是一种标准的数据库语言,目前大多数DBMSDBMS都支持它。都支持它。2010年10月2重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋7.2 ODBC7.2 ODBC基本概念基本概念ODBCODBC是微软公司开放服务结构中有关数据库的一个组成部分,它建立了是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供
6、了一组对数据库访问的标准一组规范,并提供了一组对数据库访问的标准APIAPI。这些。这些APIAPI利用利用SQLSQL来来完成大部分任务,完成大部分任务,ODBCODBC本身也提供了对本身也提供了对SQLSQL语言的支持,用户可以直接语言的支持,用户可以直接将将SQLSQL语句送给语句送给ODBCODBC;基于基于ODBCODBC的应用程序对数据库的操作不依赖于任何的应用程序对数据库的操作不依赖于任何DBMSDBMS,不直接与,不直接与DBMSDBMS打交道,所有的数据库操作由对应打交道,所有的数据库操作由对应DBMSDBMS的的ODBCODBC驱动程序完成,一个完整驱动程序完成,一个完整的
7、的ODBCODBC由下列几个部件组成;由下列几个部件组成;应用程序:应用程序:ODBCODBC管理器:管理安装的管理器:管理安装的ODBCODBC驱动程序和管理数据源;驱动程序和管理数据源;驱动程序管理器:包含在驱动程序管理器:包含在ODBC32.DLLODBC32.DLL中,任务是管理中,任务是管理ODBCODBC驱动程序;驱动程序;ODBC APIODBC API:给数据库应用程序提供访问数据库的接口函数;:给数据库应用程序提供访问数据库的接口函数;ODBCODBC驱动程序:一些驱动程序:一些DLLDLL,提供了,提供了ODBCODBC和数据库之间的接口;和数据库之间的接口;数据源:包含数
8、据库位置和数据库类型的信息。数据源:包含数据库位置和数据库类型的信息。在在ODBCODBC中,中,ODBC APIODBC API不能直接访问数据库,必须通过驱动程序管理器与不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对数据库交换信息。驱动程序管理器负责将应用程序对ODBC APIODBC API的调用传的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。驱动程序管理器返回给应用程序。ODBC部件关系图部件关系图2010年10月3重庆理工大学
9、计算机科学与工程学院计算机科学与技术系刘恒洋7.3 MFC7.3 MFC的的ODBCODBC类简介类简介MFCMFC的的ODBCODBC类主要包括有以下几个:类主要包括有以下几个:CDatabaseCDatabase类:负责建立与数据源的连接;类:负责建立与数据源的连接;CRecordsetCRecordset类:类:该类的一个对象代表从数据源选择的一组记录该类的一个对象代表从数据源选择的一组记录(记录集);(记录集);CRecordViewCRecordView类:提供了一个表单视图与某个记录集直接相连,利类:提供了一个表单视图与某个记录集直接相连,利用对话框数据交换机制用对话框数据交换机制
10、(DDX)(DDX)在记录集与表单视图的控件之间传输数在记录集与表单视图的控件之间传输数据;据;CFieldExchangeCFieldExchange类:支持记录字段数据交换类:支持记录字段数据交换(DFX)(DFX),即记录集字段数,即记录集字段数据成员与相应的数据库表的字段之间的数据交换;据成员与相应的数据库表的字段之间的数据交换;CDBExceptionCDBException类:代表类:代表ODBCODBC产生的异常。产生的异常。概括地讲,概括地讲,CDatabaseCDatabase针对某个数据库,它负责连接数据源;针对某个数据库,它负责连接数据源;CRecordsetCRecor
11、dset针对数据源中的记录集,它负责对记录的操作;针对数据源中的记录集,它负责对记录的操作;CRecordViewCRecordView负责界面;负责界面;CFieldExchangeCFieldExchange负责负责CRecordsetCRecordset与与数据源的数据交换。数据源的数据交换。2010年10月4重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋先构造一个先构造一个CDatabaseCDatabase对象,然后调用对象,然后调用OpenOpen成员函数:成员函数:lpszDSNlpszDSN:数据源名,也可以在:数据源名,也可以在lpszConnectlpszConn
12、ect参数中包括数据源名,此时参数中包括数据源名,此时lpszDSNlpszDSN必须为必须为NULLNULL,若两处均未提供数据源名,则会显示一个数据源对话,若两处均未提供数据源名,则会显示一个数据源对话框,用户可以在该对话框中选择一个数据源;框,用户可以在该对话框中选择一个数据源;参数参数bExclusivebExclusive:说明是否独占数据源;:说明是否独占数据源;参数参数bReadOnlybReadOnly:TrueTrue则对数据源的连接是只读的,否则为可读写的;则对数据源的连接是只读的,否则为可读写的;参数参数lpszConnectlpszConnect:指定了一个连接字符串。
13、该串中可以包括数据源名、用:指定了一个连接字符串。该串中可以包括数据源名、用户账号和口令等信息,字符串中的户账号和口令等信息,字符串中的ODBCODBC表示要连接到一个表示要连接到一个ODBCODBC数据源上;数据源上;参数参数bUseCursorLibbUseCursorLib:若为:若为TrueTrue,则会装载光标库,否则不装载。快照需要,则会装载光标库,否则不装载。快照需要光标库,动态集不需要光标库;光标库,动态集不需要光标库;若连接成功,函数返回若连接成功,函数返回TrueTrue,否则返回,否则返回FalseFalse,若函数内部出现错误,则会,若函数内部出现错误,则会产生一个异常
14、。产生一个异常。一些其它的有用成员函数:一些其它的有用成员函数:virtual BOOL Open(LPCTSTR lpszDSN,BOOL bExclusive=FALSE,BOOL bReadOnly=FALSE,LPCTSTR lpszConnect=ODBC;,BOOL bUseCursorLib=TRUE);throw(CDBException,CMemoryException);CDatabase m_db;/在文档类中嵌入一个在文档类中嵌入一个CDatabase对象对象m_db.Open(Student Registration);/连接到一个名为连接到一个名为Student R
15、egistration的数据源的数据源m_db.Open(NULL,FALSE,FALSE,ODBC;DSN=Student Registration;UID=ZYF;PWD=1234);/在连接数据源的同时指定了用户账号和口令在连接数据源的同时指定了用户账号和口令m_db.Open(NULL);/将弹出一个数据源对话框将弹出一个数据源对话框virtual void Close();/断开与数据库的连接,断开与数据库的连接,CDatabase的析构函数中同样会自动调用该函的析构函数中同样会自动调用该函数数BOOL IsOpen()const;/返回返回True则表明当前有一个连接则表明当前有一
16、个连接const CString&GetConnect()const;/获取当前的连接字符串获取当前的连接字符串7.3.1 7.3.1 CDatabaseCDatabase类类2010年10月5重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋1.1.动态集、快照、光标和光标库动态集、快照、光标和光标库共享数据的一个主要问题就是如何协调各个用户对数据源的修改,在共享数据的一个主要问题就是如何协调各个用户对数据源的修改,在MFCMFC中这取决于用户采用哪种记录集来处理;中这取决于用户采用哪种记录集来处理;记录集主要分为快照记录集主要分为快照(Snapshot)(Snapshot)和动态集和
17、动态集(DynasetDynaset)两种:两种:快照型记录集提供了对数据的静态视,当其他用户改变了记录时快照型记录集提供了对数据的静态视,当其他用户改变了记录时(包括修改、包括修改、添加和删除添加和删除),快照中的记录不受影响;,快照中的记录不受影响;动态集提供了数据的动态视,当其他用户修改或删除了记录集中的记录时,动态集提供了数据的动态视,当其他用户修改或删除了记录集中的记录时,会在动态集中反映出来。会在动态集中反映出来。在记录集中滚动,需要有一个标志来指明滚动后的位置。在记录集中滚动,需要有一个标志来指明滚动后的位置。ODBCODBC驱动程序驱动程序会维护一个光标,用来跟踪记录集的当前记
18、录;会维护一个光标,用来跟踪记录集的当前记录;光标库是处于光标库是处于ODBCODBC驱动程序管理器和驱动程序之间的动态链接库。光标驱动程序管理器和驱动程序之间的动态链接库。光标库的主要功能是支持快照以及为底层驱动程序提供双向滚动能力。光标库的主要功能是支持快照以及为底层驱动程序提供双向滚动能力。光标库管理快照记录的缓冲区,该缓冲区反映本程序对记录的修改和删除,库管理快照记录的缓冲区,该缓冲区反映本程序对记录的修改和删除,但不反映其他用户对记录的改变,由此可见,快照实际上相当于当前的但不反映其他用户对记录的改变,由此可见,快照实际上相当于当前的光标库缓冲区;光标库缓冲区;与快照不同,动态集不用
19、光标库维持的缓冲区来存放记录。与快照不同,动态集不用光标库维持的缓冲区来存放记录。7.3.2 7.3.2 CRecordSetCRecordSet类类2010年10月6重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋2.SQL2.SQL查询查询记录集的建立实际上是一个查询过程,记录集的建立实际上是一个查询过程,SQLSQL的的SELECTSELECT语句用来查询数据语句用来查询数据源。在建立记录集时,源。在建立记录集时,CRecordsetCRecordset会根据参数构造一个会根据参数构造一个SELECTSELECT语句来查语句来查询数据源,并用查询的结果创建记录集,询数据源,并用查
20、询的结果创建记录集,SELECTSELECT语句的句法如下:语句的句法如下:如果列名或表名中包含有空格,则必须用方括号把该名称括起来;如果列名或表名中包含有空格,则必须用方括号把该名称括起来;SELECT field-list FROM table-name WHERE m_strFilter ORDER BY m_strSort 3.3.记录集的建立和关闭记录集的建立和关闭要建立记录集,首先要构造一个要建立记录集,首先要构造一个CRecordsetCRecordset派生类对象,然后调用派生类对象,然后调用OpenOpen成员函数查询数据源中的记录来建立记录集成员函数查询数据源中的记录来建立
21、记录集CRecordset(CDatabase*pDatabase=NULL);virtual CString GetDefaultConnect();virtual BOOL Open(UINT nOpenType=AFX_DB_USE_DEFAULT_TYPE,LPCTSTR lpszSQL=NULL,DWORD dwOptions=none);throw(CDBException,CMemoryException);BOOL CanRestart()const;/若支持若支持Requery则返回则返回TrueBOOL IsOpen()const;/若记录集已建立则返回若记录集已建立则返回
22、True2010年10月7重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋4.4.滚动记录滚动记录CRecordsetCRecordset提供了以下所示几个成员函数用来在记录集中滚动:提供了以下所示几个成员函数用来在记录集中滚动:void MoveNext();/前进一个记录前进一个记录void MovePrev();/后退一个记录后退一个记录void MoveFirst();/滚动到记录集中的第一个记录滚动到记录集中的第一个记录void MoveLast();/滚动到记录集中的最后一个记录滚动到记录集中的最后一个记录void SetAbsolutePosition(long nRow
23、s);/滚动到绝对位置滚动到绝对位置virtual void Move(long nRows,WORD wFetchType=SQL_FETCH_RELATIVE);BOOL IsEOF()const;BOOL IsBOF()const;long GetRecordCount()const;5.5.修改、添加和删除记录修改、添加和删除记录通过向通过向CDatabaseCDatabase对象的对象的ExecuteSQLExecuteSQL成员函数传递成员函数传递SQLSQL语句的方法达到修语句的方法达到修改、添加和删除数据库数据的目的改、添加和删除数据库数据的目的 void ExecuteSQL(LPCSTR lpszSQL);throw(CDBException);2010年10月8重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋7.4 7.4 实例系统中数据库操作类的设计实例系统中数据库操作类的设计参见实验。参见实验。2010年10月9重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋