第6章创建和使用对话框1第九章连接数据库精讲微机在商业上的应用主要在数据处理,要求能够快速方便地访问一个大型数据库中的记录,MFC提供了两种独立地面向用户的数据库访问系统,一种是ODBC(OpenDataBaseConnectivity,开放数据库连接),另一种是DAO(DataAccessObjects,数据访问对象)。本章你将学会使用ODBC和DAO连接数据库,并能够简单地操作数据库数据。9.1MFCODBC连接数据库ODBC是微软公司支持开放数据库服务体系的重要组成部分,它定义了一组规范,提供了一组对数据库访问的标准API,这些API是建立在标准化版本SQL(StructedQueryLanguage,结构化查询语言)基础上的。ODBC位于应用程序和具体的DBMS之间,目的是能够使应用程序端不依赖于任何DBMS,与不同数据库的操作由对应的DBMS的ODBC驱动程序完成。9.1.1ODBC的构成ODBC的结构如图9-1所示。图9-1使用ODBC的层次图ODBC层由三个部件构成:1.ODBC管理器ODBC管理器的主要任务是管理安装ODBC驱动程序,管理数据源。应用程序要访问数据库,首先必须在ODBC管理器中创建一个数据源。ODBC管理器根据数据源提供的数据库存储位置,类型及ODBC驱动程序信息,建立起ODBC与一个特定数据库之间的联系,接下来,程序中只需提供数据源名,ODBC就能连接相关的数据库。ODBC管理器位于系统控件面板中。应用程序数据源DSNODBCAPI(SQL)ODBC管理器驱动程序管理器ODBC驱动程序数据源ODBC层VC++6简明教程22.驱动程序管理器驱动器管理器位于ODBC32.DLL,是ODBC中最重要的部件,应用程序通过ODBCAPI执行数据库操作。其实ODBCAPI不能直接操作数据库,需要通过驱动管理器调用特定的数据库的驱动程序,驱动程序在执行完相应操作后,再将结果通过驱动程序管理器返回。驱动器管理器支持一个应用程序同时访问多个DBMS中的数据。3.ODBC驱动程序ODBC驱动程序以DLL文件形式出现,提供ODBC与数据库之间的接口。9.1.2MFCODBC类进行ODBC编程,有三个非常重要的元素:环境(Enviroment),连接(Connection)和语句(Statement),它们都是通过句柄来访问的。在MFC的类库中,CDatabase类封装了ODBC编程的连接句柄,CRecordset类封装了对ODBC编程的语句句柄,而环境句柄被保存在一个全局变量中,可以调用一个全局函数AfxGetHENV来获得当前被MFC使用的环境句柄。此外CRecordView类负责记录集的用户界面,CFieldExchange负责CRedordset类与数据源的数据交换。使用AppWizard生成应用程序框架过程中,只要选择了相应的数据库支持选项,你就能够很方便地获得一个数据库应用程序的框架。1.CDatabase类CDatabase类的主要功能是建立与ODBC数据源的连接,连接句柄放在其数据成员m_hdbc中,并提供一个成员函数GetConnect()用于获取连接字符串。要建立与数据源的连接,首先创建一个CDatabase对象,再调用CDatabase类的Open()函数创建连接。Open()函数的原型定义如下:virtulBOOLOpen(LPCTSTRlpszDSN,BOOLbExclusive=FALSE,BOOLbReadOnly=FALSE,LPCTSTRlpszConnect=”ODBC;”,BOOLbUseCursorLib=TRUE);其中:lpszDSN指定数据源名,若lpszDSN的值为NULL时,在程序执行时会弹出数据源对话框,供用户选择一个数据源。lpszConnect指定一个连接字符串,连接字符串中通常包括数据源名、用户ID、口令等信息,与特定的DBMS相关。例如:CDatabasedb;db.Open(NULL,FALSE,FALSE,”ODBC;DSN=HotelInfo;UID=SYSTEM;PWD=123456”);从断开与一个数据源的连接,可以调用CDatabase类的成员函数Close()。2.CRecordset类CRecordset类对象表示从数据源中抽取出来的一组记录集。CRecordset类封装了大量操作数据库的函数,支持查询,存取,更新数据库操作。记录集主要分为两种类型:(1)快照(Snapshot)记录集快照记录集相当于数据库的一张静态视图,一旦从数据库抽取出来,当别的用户更新记录的操作是不会改变记录集,只有调用Requry()函数重新查询数据,才能反映数据的变化。自身用户的添加记录操作重要调用Requry()函数重新查询数据,但快照集能反应自身用户的删除和修改操作。第6章创建和使用对话框3(2)动态(Dynaset)记录集动态(Dynaset)记录集与快照记录集恰恰相反,是数据库的动态视图。当别的用户更新记录时,动态记录集能即时反映所作的修改。在一些实时系统中必须采用动态记录集,如火车标联网购票系统。但别的用户添加记录,也需要调用Requry()函数重新查询数据后才能反映出来。CRecordset有六个重要的数据成员如表9-1所示.。表9-1CRecordset类的数据成员数据成员类型说明m_strFilterCString筛选条件字符串m_strSortCString排序关键字字符串m_pDatabaseCDatabase类指针指向CDatabasec对象的指针m_hstmtHSTMTODBC语句句柄m_nFieldUINT记录集中字段数据成员总数m_nParamsUINT记录集中参数数据成员总数CRecordset的主要成员函数如表9-2所示:表9-2CRecordset类的成员函数成员函数类型Move当前记录指针移动若干个位置MoveFirst当前记录指针移动到记录集第一条记录MoveLast当前记录指针移动到记录集最后一条记录MoveNext当前记录指针移动到记录集下一条记录MovePrev当前记录指针移动到记录集前一条记录SetAbsolutePosition当前记录指针移动到记录集特定一条记录AddNew添加一条新记录Delete删除一条记录Edit编辑一条记录Update更新记录CancelUpdate取消一条记录的更新操作Requry重新查询数据源GetDefaultConnect获得默认连接字符串GetDefaultSQL获得默认SQL语句DoFieldExchange记录集中字段数据成员与数据源中交换数据GetRecordCount获得记录集记录个数IsEOF判断当前记录指针是否在最后一个记录之后IsBOF判断当前记录指针是否在第一个记录之前CanUpdate判断记录集是否允许更新3.CRecordView类CRecordView类是CFormView的派生类,支持以控件视图来显示当前记录,并提供移动记录的默认菜单和工具栏,用户可以通过记录视图方便地浏览、修改、删除和添加记录。记录视图与对话框一样使用DDX数据交换机制在视图中的控件的记录集成员之间交换数据,只需使用ClassWizard将控件与记录集的字段数据成员一一绑定。CRecordView的主要函数如表9-3所示:VC++6简明教程4表9-3CRecordView类的主要成员函数成员函数类型OnGetRecordset获得指向记录集的指针OnMove当前记录指针移动时,OnMove()函数更新对当前记录所作的修改,这是将更新记录保存的方式。IsOnFirstRecord判断当前记录是否为记录集的第一条记录IsOnLastRecord判断当前记录是否为记录集的最后一条记录4.CFieldExchange类CFieldExchange类支持记录字段数据的自动交换,实现记录集中字段数据成员与相应的数据源中字段之间的数据交换,类似于对话框数据自动交换机制。9.2数据库应用程序的实现9.2.1创建并注册数据源在创建数据库应用程序之前,先要准备好数据源。下面我们假设数据库应用程序要连接的数据库hotel.mdb存放在C盘根目录下,该数据库下有一张TblCustomer的表,如图9-2所示:图9-2数据表“tblCustomer”在Windows操作系统的控制面板中,可以找到数据源ODBC管理器的图标,如图9-3所示为windowsXPhomeEditon中的ODBC的图标,它的位置在控制面板中的管理工具文件夹。由于所要连接的数据库是由MicrosoftACCESS创建,要求ODBC管理器中安装有MicrosoftACCESS的ODBC驱动程序。一般,只需安装了MicrosoftACCESS软件,相应的ODBC驱动程序就已经默认安装了。图9-3ODBC图标第6章创建和使用对话框5鼠标双击ODBC图标,弹出“ODBC数据源管理器”对话框,如图9-4所示。图9-4ODBC数据源管理器在用户DSN、系统DSN、文件DSN标签页中都可以创建一个数据源,但所创建的数据源的应用范围是不同的:(1)用户DSN:用户数据源只对当前用户可见,而且只能用于当前机器上。(2)系统DSN:系统数据源对当前机器上的所有用户可见。(3)文件DSN:文件数据源可以由安装了相同驱动程序的用户共享。可以根据所创建的数据源的不同的应用场合选择在不同的标签页下创建数据源,在本例中选择系统DSN。在标签页中的列表中显示的是在本机已创建的系统数据源的列表。单击“Add”按钮,新建一个数据源,弹出“创建新数据源”对话框。如图9-5所示,在ODBC驱动程序列表中选择“MicrosoftAccessDriver(*.mdb)”。图9-5选择ODBC驱动程序类别VC++6简明教程6单击“Finish”按钮,弹出“ODBCMicrosoftAccess安装”对话框,如图9-6所示。在数据源名文本框中填入:HotelInfo,单击“选择”按钮,弹出“选择数据库”对话框,如图9-7所示,选择数据库文件c:\hotel.mdb,连续单击“OK”按钮回到前一对话框。图9-6设置MicrosoftAccess数据源图9-7选择数据库最后在系统DSN标签中可以看到创建的数据源HotelInfo出现在数据源列表中,如图9-8所示。第6章创建和使用对话框7图9-8创建好的系统数据源9.2.2创建数据库应用框架〖例9-1〗使用AppWizard可以方便地得到一个数据库应用程序的框架,创建一个MFCEXE应用程序Exam9_1,在向导的第2步中,选择单选项“Databaseviewwithoutfilesupport”,如图9-9所示。图9-9设置数据库支持单击“DataSource”按钮,弹出“DataOptions”对话框,选择单选项ODBC,并在下拉框中选择事先建立好的数据源“HotelInfo”,如图9-10所示。VC++6简明教程8图9-10选择ODBC数据源单击“OK”按钮,弹出“SelectDatabaseTables”对话框,列表框中列出了HotelInfo数据库中所包含的表和查询,选择应用程序所操作的表tblCustomer,如图9-11所示。图9-11选择数据库表单击“OK”按钮,结束数据源的设置工作,在图9-9中“DataSource”按钮的下方会出现数据源的选择信息。单击“Finish”按钮,完成数据库应用程序框架的创建,编译运行这个程序,运行结果如图9-12所示。应用程序包含了数据库记录基本操作菜单和工具按钮,视图是一个对话框,可以添加控件。第6章创建和使用对话框9图9-12数据库应用程序框架运行效果选择工作区的ClassView,展开类树,进一步观察AppWizard自动添加的与数据库支持有关的内容。增加了一个CExam9_1Set类,该类代表从HotelInfo中选择的一组记录集。程序可以选择一个表作为一个记录集,本例选择了表tblCustomer中的记录构建记录集,也可以选择一个查询的结果集作为一个记录集。如程序清单9