利用Dao访问数据库_第1页
利用Dao访问数据库_第2页
利用Dao访问数据库_第3页
利用Dao访问数据库_第4页
利用Dao访问数据库_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC+数据库访问---DAOMFCDAOfc编程方法上并没有太多的不同,例如在这里以类CDaoDatabase弋替了前面的CDatabase,以CDaoRecordSet代替了CRecordSet等。但两者也不是完全一样,依据用户使用的数据系统不同,选择不同接口会导致应用性能方面的较大差异,例如要通过MicrosoftJet数据引擎访问MicrosoftAccess数据库,使用DAOt会有显著的性能优势。另外,DAO妾口还有其他一些特点,比如可以通过DAOm可数据库中的数据和数据库的定义,而且,DAB身就是一组COM1口,加上MFC勺封装,在很程度上会简化编程。1。MFCDAOf数据库DAO-数据访问对象,提供了一种通过程序代码创建和操作数据库的机制。要向深入了解DA6U建和操作数据库的手段,必须先对MicrosoftJet数据引擎有一定的了解。简单的说,MicrosoftJet是一种数据管理组件,许多数据库工具(如Access等)都是通过它实现其功能的,同时,通过Jet引擎可以访问数据库中的数据和数据库结构定义。DAO1过MicrosoftJet数据引擎提供了一套对象,包括:数据库对象(Database)、表定义(TableDef)、查询定义对象(QueryDef)和记录集对象(Recordset)等。MFCDAO封装了DAO勺功能,说到底是通过MicrosoftJet数据引擎来访问系统和用户数据库中的数据。一般来说,基于DAO勺MFC1比基于ODBC勺MFC!处理能力更强。因为基于DAO勺类可以通过ODBC区动,也可以通过自己的数据库引擎(Jet)存取数据。下面举例说明常见的数据库的访问方式与技巧。首先介绍CDaoDatabas睽以及CDaoDataBase::Open()函数。类CDaoDatabasebl供了一个和MFCDDBCtCDatabase类似的接口。但是它们之间也有区别,表现在CDatabase是通过ODBC口ODB邮动程序存取数据的,而CDataDatabase则是通过数据存取对象存取数据的。通过DA6问不同的数据库的关键在于CDaoDatabase::Open()函数。该函数的原型如下:Open(LPCTSTRlpszName,BOOLbExclusive=FALSE,BOOLbReadOnly=FALSE,LPCTSTRlpszConnect=_T(""));lpszName-要打开的数据库路径。bExclusive-以独占方式(TRUE成共享方式(FALSE)打开。bReadOnly-以只读方式(TRUE域读/写方式(FALSE打开。IpszConnect-说明连接数据库的属性字段(这就是“关键”所在)。下面介绍DAOto何访问两个常用的数据源:Access数据库这是MicrosoftJet数据引擎能够读取的数据库中,通过DAC^问效率最高的数据库(.mdb)之一。访问Access数据库的方法最简单,只要Open()函数给出第一个参数,其他三个参数都缺省就表示打开一个Access数据库,这里就不举例了。ODB嗷据源通过DA6问ODB做据源必须同日t具有相应的ODBC驱动程序。ODBCt据库包括SQLServer,OracleServer等。例如,可以用ClassWizard从CDaoRecordSet派生一个新类,这个新类可以访问ODB做据源。处理DAO寸象1)异常处理对数据库的错误操作经常会引发异常,利用MFCDAO进行的数据库编程也一样,这里首先给出DA源常处理函数,以备后文使用。voidDispDaoException(CDaoException*e)(CStringstr;if(e->m_pErrorInfo!=NULL)(str.Format(_T("%s(%d)\n'n")_T(Wouldyouliketoreference?"),(LPCTSTR)e->m_pErrorInfo->m_strDescription,e->m_pErrorInfo->m_lErrorCode);if(AfxMessageBox(str,MB_YESNO)==IDYES)(WinHelp(GetDesktopWindow(),e->m_pErrorInfo->m_strHelpFile,HELP_CONTENT,e->m_pErrorInfo->m_lHelpContent);}}else{str.Format(_T("ERROR:CDaoException\n'n")_T("SCODE_CODE=%d\n")_T("SCODE_FACILITY=%d\n")_T("ResultFromScode=%d'n"),SCODE_CODE(e->m_scode),SCODE_FACILITY(e->m_scode),SCODE_SEVERITY(e->m_scode),ResultFromScode(e->m,scode));AfxMessageBox(str);))2)数据库对象在MFB,DAO据库对象是由CDaoDatabase类封装的,它代表了与数据库的连接,只有通过这个连接,应用程序才能实现对数据库的操作。(1)新建数据库创建一个数据库的基本思路是先用CDaoDatabase类构造一个空的数据库对象,然后调用CDaoDatabase类的Create()函数创建新的数据库。下面就来介绍创建md跋据库的方法:CDaoDatabasedb;try{db.Create("d:\\work\\test.mdb");//全路径)catch(CDaoException*e){DispDaoException(e);e->Delete();return;)catch(CMemoryException*e)(//内存异常处理)从Create()函数的原型中可以选择更多的创建数据库的限制条件。(2)打开数据库跟创建数据库类似,打开一个现有的数据库应用应该先用CDaoDatabasea构造一个空的数据库对象,然后用CDaoDatabas睽的Open()函数打开数据库。具体代码实现如下:CDaoDatabasedb;try(db.Create("d:\\work\\test.mdb");//全路径)catch(CDaoException*e)DispDaoException(e);e->Delete();return;)catch(CMemoryException*e)(//内存异常处理)需要说明的是,一般情况下,只要路径名正确,创建和打开数据库都不会出什么异常,但是为了程度的鲁棒性,在开发真是应用软件时,这些异常是非常必要的。(3)关闭数据库数据库对象使用完毕后需要关闭该对象,以免数据库中的数据会发生意外的丢失或改变,这与打开一个文件操作完毕后需要关闭文件的道理是一样的。要关闭一个数据库,只要调用CDaoDatabase^的Close()函数即可,具体实现如下:if(db.IsOpen())db.Close();3)表定义对象上面已经说明了如果建立和打开数据库,而数据库是由表组成的,因此这一部分继续介绍表的操作。CDaoTableDef类对象封装了DAOll定义结构,该对象定义俩基础表和附加表。所谓基础表是MicrosoftJet数据库中的表,使用DAO寸象可以操作表的结构,可以利用记录集或查询修改其中的数据,而附加表是指连接到MicrosoftJet数据库中的其他数据库表,附加表中的数据依然存放在外部数据库中。(1)新建表创建表定义对象的同时也为所操作的数据库增加一个新表,创建表定义后还需要接着为其添加字段(域),如果有必要还可以添加索引,否则这个表不能被加入到数据库的。新建一个表定义对象的过程如下:首先打开一个数据库,然后在数据库上使CDaoTableDef的构造函数构造一个表定义对象,然后用Create()函数创建新表(加入字段),最后调用Append()函数将新表加入到数据库中,为节省篇幅,异常处理部分仅用“//异常处理.....”代替。if(!db.IsOpen())//要进行下面的操作,数据库必须打开,db代表要操作的数据库return;

CDaoTableDeftd(&db);对象//创建新表//构造表try//构造表(td.Create("PERSONNEL");)//异常处理……//力口入字段“EMPLOYEE_IDtry(td.CreateField("EMPLOYEE_ID",dbLong,dbAutoIncrField);)//异常处理……//加入字段"EMPLOYEE_NAME"try(td.CreateField("EMPLOYEE_NAME",dbText,10,dbVariableField);)//异常处理......//表表加入到库中try(td.Append();)//异常处理……td.Close();//注意,表也要关闭if(db.IsOpen())db.Close();(2)打开表首先打开表所在的库,然后在该库上调用CDaoTableDef的构造函数定义一个表对象,然后用Open()函数打开表:if(!db.IsOpen())//要进行下面的操作,数据库必须打开,db代表要操作的数据库return;CDaoTableDeftd(&db);//构造表对象//打开表try

td.Open("PERSONNEL");)//异常处理(3)修改表的结构修改表的结构包括表中添加、删除字段,或者对某一字段添加、删除索引。其操作过程是,先打开表所在的数据库,然后打开表,最后调用CDaoTableDef::CreateField()和CDaoTableDef::DeleteField()添加、删除字段,用CDaoTableDef::CreateIndex()和CDaoTableDef::DeleteIndex()添加、删除索引。if(!db.IsOpen())//要进行下面的操作,数据库必须打开,db代表要操作的数据库//构造表return;//构造表CDaoTableDeftd(&db);对象//打开表try(td.Open("PERSONNEL");//异常处理……//力口入字段"EMPLOYEE_ADDRESS"try(td.CreateField("EMPLOYEE_ADDRESS",dbText,45,dbVariableField);}//异常处理……(4)删除表删除表会表表的定义和表中的数据一起删除。if(db.IsOpen())db.DeleteTableDef("PERSONNEL");db.Close();4)记录集对象CDaoRecordSet封装了Dao记录集对象,用于管理一个来自表定义(基础表)或查询定义的记录集合。CDaoRecordSet对象有三中使用的原型,如下表说是:DaoRecordSet对象的几种类型说明table-type|基于单个数据表,可对记录施加增、删、该的操作dynaset-type|基于组合查询,可以包含来自一个或多个表的字段,可对一个或多个表施加操作snapshot-type|基于组合查询的静态拷贝,可以包含来自一个或多个表的字段,可以查询数据|和生成报表,但不能对其进行更新下面讲述对记录集的几种常见操作:(1)新建记录集有两种使用记录集的方法:第一种是直接从CDaoRecordSet类创建记录集,并且动态绑定记录字段,这种方法这里不作详细介绍;第二种是使用ClassWizard创建CDaoRecordSet类的派生类,并禾用DFX机制记录数据与记录集字段数据成员之间的映射。下面以创建到记录集的映射为例,简要说明第二种方法(这种方法在ODBCf问数据库方式下也可以类似使用,不过把基类选为CRecordSet就可以了)。在类向导的数据库表选择对话框中,可以一次选择多个表,即可以实现表到记录集多对一的映射关系。(2)添加记录添加一条记录的基本过程如下:首先打开数据库和表,接着定义一个表的CDaoRecordSet对象,然后调用CDaoRecordSet::AddNew函数使表处于插入状态,再调用SetFieldValue函数给字段赋值,最后调用Update()函数完成插入。由于前面已经介绍如何打开表,后面的过程非常明白,在这里就不要举例说明了。仅列出主要语句:rs.AddNew();CStringstrSrc.Format("%s",str);COleVarianttmpVal=COleVariant(strSrc);rs.SetFieldValue("EMP_NAME",tmpVal);rs.Update();(3)修改记录修改一条记录的基本过程如下:首先打开数据库和表,接着定义一个表的CDaoRecordSet对象,然后按条件定位记录并调用CDa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论