还剩16页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
VC++数据库访问--DAO MFC DAO在编程方法上并没有太多的不同,例如在这里以类CDaoDatabase代替了前面的CDatabase,以CDaoRecordSet代替了CRecordSet等但两者也不是完全一样,依据用户使用的数据系统不同,选择不同接口会导致应用性能方面的较大差异,例如要通过Microsoft Jet数据引擎访问Microsoft Access数据库,使用DA0就会有显著的性能优势此外,DA0接口还有其他一些特点,比如可以通过DA0访问数据库中的数据和数据库的定义,而且,DA0本身就是一组COM接口,加上MFC的封装,在很程度上会简化编程lo MFCDAO与数据库DAO一数据访问对象,供应了一种通过程序代码创建和操作数据库的机制要向深化了解DA0创建和操作数据库的手段,必需先对Microsoft Jet数据引擎有肯定的了解简洁的说,Microsoft Jet是一种数据管理组件,很多数据库工具如Access等都是通过它实现其功能的,同时,通过Jet引擎可以访问数据库中的数据和数据库结构定义DA0通过Microsoft Jet数据引擎供应了一套对象,包括:数据库对象Database、表定义TableDef、查询定义对象try td.CreateField〃EMPLOYEE_ID”,dbLong,dbAut olncrField;〃特别处理......〃加入字段EMPLOYEE_NAME”trytd.CreateField〃EMPLOYEE_NAME〃,dbText,10,dbVariableField;〃特别处理......〃表表加入到库中trytd.Append;〃特别处理......td.Close;〃留意,表也要关闭if db.IsOpendb.Close;2打开表首先打开表所在的库,然后在该库上调用CDaoTableDef的构造函数定义一个表对象,然后用Open函数打开表if!db.IsOpen〃要进行下面的操作,数据库必需打开,db代表要操作的数据库return;CDaoTableDef tddb;〃构造表对象〃打开表trytd.OpenPERSONNEL;〃特别处理......3修改表的结构修改表的结构包括表中添加、删除字段,或者对某一字段添加、删除索引其操作过程是,先打开表所在的数据库,然后打开表,最终调用CDaoTableDef::CreateField和CDaoTableDef::DeleteField添加、删除字段,用CDaoTableDef::Createlndex和CDaoTableDef::DeletelndexO添加、删除索引if!db.IsOpen〃要进行下面的操作,数据库必需打开,db代表要操作的数据库return;CDaoTableDef tddb;〃构造表对象〃打开表trytd.OpenPERSONNEL;〃特别处理......〃加入字段EMPLOYEE_ADDRESS〃try|td.CreateField〃EMPLOYEE_ADDRESS”,dbText,45,dbVariableField;〃特别处理......4删除表删除表会表表的定义和表中的数据一起删除if db.IsOpenO db.DeleteTableDefPERSONNEL;db.Close;4纪录集对象CDaoRecordSet封装了Dao纪录集对象,用于管理一个来自表定义基础表或查询定义的纪录集合CDaoRecordSet对象有三中使用的原型,如下表说是:DaoRecordSet对象的几种类型说明table-type I基于单个数据表,可对纪录施加增、删、该的操作dynaset-type I基于组合查询,可以包含来自一个或多个表的字段,可对一个或多个表施加操作snapshot-type I基于组合查询的静态拷贝,可以包含来自一个或多个表的字段,可以查询数据I和生成报表,但不能对其进行更新下面叙述对纪录集的几种常见操作:1新建纪录集有两种使用纪录集的方法第一种是直接从CDaoRecordSet类创建纪录集,并且动态绑定纪录字段,这种方法这里不作具体介绍;其次种是使用ClassWizard创建CDaoRecordSet类的派生类,并采用DFX机制纪录数据与纪录集字段数据成员之间的映射下面以创建到纪录集的映射为例,简要说明其次种方法这种方法在ODBC访问数据库方式下也可以类似使用,不过把基类选为CRecordSet就可以了在类向导的数据库表选择对话框中,可以一次选择多个表,即可以实现表到纪录集多对一的映射关系2添加纪录添加一条纪录的基本过程如下首先打开数据库和表,接着定义一个表的CDaoRecordSet对象,然后调用CDaoRecordSet::AddNew函数使表处于插入状态,再调用SetFieldValue函数给字段赋值,最终调用Update函数完成插入由于前面已经介绍如何打开表,后面的过程特别明白,在这里就不要举例说明白仅列出主要语句rs.AddNew;CString strSrc.Format%s,str;COleVariant tmpVal=C01eVariantstrSrc;rs.SetFieldValueZ,EMP_NAME,Z,tmpVal;rs.Update;3修改纪录修改一条纪录的基本过程如下首先打开数据库和表,接着定义一个表的CDaoRecordSet对象,然后按条件定位纪录并调用CDaoRecordSet::Edit函数使表处于编辑状态,再调用SetFieldValue函数给字段赋新值,最终调用Update函数保存修改结果这里仅列出主要语句rs.Edit;CString strSrc.Format str;COleVariant tmpVal=C01eVariantstrSrc;rs.SetFieldValueEMP_NAME”,tmpVal;rs.Update;4删除纪录删除纪录的过程比前两者都要简洁,在定位纪录以后只要调用CDaoRecordSet::Delete函数就可以将当前纪录删除了QueryDef和纪录集对象Recordset等MFCDAO封装了DAO的功能,说究竟是通过Microsoft Jet数据引擎来访问系统和用户数据库中的数据一般来说,基于DA0的MFC类比基于ODBC的MFC类处理力量更强由于基于DAO的类可以通过ODBC驱动,也可以通过自己的数据库引擎Jet存取数据下面举例说明常见的数据库的访问方式与技巧首先CDaoDatabase类以及CDaoDataBase::Open函数类CDaoDatabase供应了一个和MFC ODBC类CDatabase类似的接口但是它们之间也有区分,表现在CDatabase是通过ODBC和ODBC驱动程序存取数据的,而CDataDatabase则是通过数据存取对象存取数据的通过DA0访问不同的数据库的关键在于CDaoDatabase::0pen函数该函数的原型如下:OpenLPCTSTR IpszName,BOOL bExclusive=FALSE,BOOL bReadOnly=FALSE,LPCTSTR lpszConnect=_T;IpszName-要打开的数据库路径bExclusive-以独占方式TRUE或共享方式FALSE打开bReadOnly-以只读方式(TRUE)或读/写方式(FALSE)打开IpszConnect-说明连接数据库的属性字段(这就是“关键”所在)下面介绍DAO如何访问两个常用的数据源:1Access数据库这是Microsoft Jet数据引擎能够读取的数据库中,通过DA0访问效率最高的数据库(.mdb)之一访问Access数据库的方法最简洁,只要Open函数给出第一个参数,其他三个参数都缺省就表示打开一个Access数据库,这里就不举例了2)ODBC数据源通过DAO访问ODBC数据源必需同时具有相应的ODBC驱动程序ODBC数据库包括SQL Server,Oracle Server等例如,可以用Class Wizard从CDaoRecordSet派生一个新类,这个新类可以访问ODBC数据源
2.处理DAO对象1)特别处理对数据库的错误操作常常会引发特别,采用MFCDAO进行的数据库编程也一样,这里首先给出DAO特别处理函数,以备后文使用void DispDaoExceptionCDaoException*eCString str;ife-m_pErrorInfo!=NULL{str.Format_T〃%s%d\n\n〃J Wouldyou liketo referenced,LPCTSTRe-m_pErrorInfo-m_strE scription,e-m_pErrorInfo-m_lE rrorCodeif AfxMessageBoxstr,MB_YESNO=IDYES{WinHelp GetDesktopWindow,e-m_pErrorInfo-m_strHe e,HELP_CONTENT,e-m_pErrorInfo-m_lHelpelsestr.Format_T ERROR:CDaoExceptiori\n\n_TCSCODE_CODE=%d\n〃_T〃SCODE_FACILITY$d\n_T ResultFromScode=%d\n,SCODE_CODEe-m_scode,SCODE_FACILITYe-m_s code,SCODE_SEVERITY e-geode,ResultFromScode e^m_scode;AfxMessageBoxstr;2数据库对象在MFC中,DAO数据库对象是由CDaoDatabase类封装的,它代表了与数据库的连接,只有通过这个连接,应用程序才能实现对数据库的操作1新建数据库创建一个数据库的基本思路是先用CDaoDatabase类构造一个空的数据库对象,然后调用CDaoDatabase类的Create函数创建新的数据库下面就来介绍创建mdb数据库的方法:CDaoDatabase db;trydb.Created:\\work\\test.mdb;/全路径catchCDaoException*e{DispDaoExceptione;e-Delete;return;catchCMemoryException*e〃内存特别处理从Create函数的原型中可以选择更多的创建数据库的限制条件2打开数据库跟创建数据库类似,打开一个现有的数据库应用应当先用CDaoDatabase类构造一个空的数据库对象,然后用CDaoDatabase类的Open函数打开数据库具体代码实现如下:CDaoDatabase db;trydb.Create^d:\\work\\test.mdb;/全路径catchCDaoException*eDispDaoExceptione;e-Delete;return;catchCMemoryExc epti on*e〃内存特别处理需要说明的是,一般状况下,只要路径名正确,创建和打开数据库都不会出什么特别,但是为了程度的鲁棒性,在开发真是应用软件时,这些特别是特别必要的3关闭数据库数据库对象使用完毕后需要关闭该对象,以免数据库中的数据会发生意外的丢失或转变,这与打开一个文件操作完毕后需要关闭文件的道理是一样的要关闭一个数据库,只要调用CDaoDatabase类的Close函数即可,具体实现如下if db.IsOpendb.Close;3表定义对象上面已经说明白假如建立和打开数据库,而数据库是由表组成的,因此这一部分连续介绍表的操作CDaoTableDef类对象封装了DA0表定义结构,该对象定义俩基础表和附加表所谓基础表是Microsoft Jet数据库中的表,使用DA0对象可以操作表的结构,可以采用纪录集或查询修改其中的数据,而附加表是指连接到Microsoft Jet数据库中的其他数据库表,附加表中的数据依旧存放在外部数据库中1新建表创建表定义对象的同时也为所操作的数据库增加一个新表,创建表定义后还需要接着为其添加字段域,假如有必要还可以添加索引,否则这个表不能被加入到数据库的新建一个表定义对象的过程如下首先打开一个数据库,然后在数据库上使CDaoTableDef的构造函数构造一个表定义对象,然后用Create函数创建新表加入字段,最终调用Append函数将新表加入到数据库中,为节约篇幅,特别处理部分仅用“〃特别处理・・・・.”代替if!db.IsOpen〃要进行下面的操作,数据库必需打开,db代表要操作的数据库return;CDaoTableDef tddb;〃构造表对象〃创建新表trytd.CreatePERSONNEL;〃特别处理......〃加入字段“EMPLOYEE_ID”。