ado连接 access 数据库.docx
rename("EOF*.*adoEOF,)其中路径名可以依据自己系统安装的ADO支持文件的路径来自行设定。当编译涔遇到:tirrorl语句时,它会为引用祖件类鞭库中的接口生成包装类,Uiaurl语句事实上相当于执行了API涌数1.oadType1.ibO.轲mport语句会在工程可执行程序输出书目中产生两个文件.分别为*.tlh(类型库头文件)及*.t1i(类型库实现文件),它们分别为每一个接口产生智能指针.)-为各种接口方法、枚举类型,C1.SlD等进展*明,创立一系列包装方法。语句n。MmeSPaCe说明ADo对象不运用命名空间,rcn<u(,EOF”adoEOF”)说明将ADO中完毕标记EOF改为adoEOF,以防止和其它库中命名相冲突.其次,在程序初始过程中纪要初始化组件,一般可以用COInitiaIiZe(Nr1.D;来实现.这种方法在完毕时要关闭初始化的CftM,可以用下面语句COiInInitiaIize();来实现.在MIC中还可以采纳另一种方法来实现初始化COM,这种方法只彻要一条语句便可以自动为我们实现初始化CoM和完毕时关闭CoM的操作,语句如下所示:AfxOleInitO;接莉,就可以干脆运用M)O的操作了,我们常常运用的只是前面用#imporl语句引用类型库时.生成的包装类.tlh中声明的智能指针中的三个,它们分别是一CQnneCtiOnPtr、RecordsetPtr和一COnInandPtr.下面分别对它们的运用方法进展介绍:1./OnneclionPlr智能指针,通常用于翻开、关Ri一个库连接或用它的Execute方法来执行一个不返回结果的吩咐语句(用法和_CommandPtr中的Execute方法类似).1醐开一个用连接。先创立一个实例指针,再用OPen翎开一个库连接,它将返回一个Unknown的自动化接口指针.代码如卜所示:_ConnectionPtrm_PConneCtion;/初始化COM,创立ADO连接等操作AfxOleInitO:Ii1.pConnection.CrcatcInstance(uuidof(Connection):/在ADo操作中建议语句中要常用iry.caich来捕获错误信息,/因为它有时会常付出现一些意想不到的错误.jingzhouxumConnection->Open("Provider=Microsoft.Jet.(M.KDB.4.0;DataSource=Demo.mdb,",adM<x!eUnknom):catch(_com_errore)(AfXYeSSageBOXe数据库连接失败,确认数据库Des.mdb是否在当前路径下!”);returnFA1.SE:1 关闭一个库连接.假如连接状态有效,那么用CIOSe方法关闭它并赋于它空值。代码如下所示:if<m_rConnection->State)m_pConnection->Close();»_pConnection=NU1.1.;2 ._RecordsePtr智能指针,可以用来翻开库内数据表,并可以对表内的记录、字段等进展各种操作。1翻开数据我.翔开库内表名为I)CmCTabIe的数据表,代码如下:RccordsctPlrIiipRecordset:/在操作中建议语句中要常用try.catchO来辅状错误信息,/因为它有时会常常出现一些意想不到的用误。Jinxzhouxutry(m_PReCOrdSet-X)pen("SE1.ECT*FROMBesTable"./giftDe三oTable表中全部字段thepp._PcOnneCtion.GetInterfacePtr0./获得森接库的IDiSPatCh指针adOcnDyramic1adl.OckOptimistic,adC三dTcxt):)catch(_com_error*c)(AfxMcssaRcBox(c->ErrorMessaeO):)读取表内数据将表内数据全部读出并显示在列衣框内,mAccess1.ist为列表框的成员变革名,假如没有遇到衣完毕标记adoEOF,那么用GetC。IleCM字段名)或1.PRCeordSel->Fields->GelIlem(字段名)-*aluc方法,来获得当前记录指针所指的字段值,然后再用MoveNextU方法移动到下一条记录位置.代码如下所示:.variant,var;CStringStrNaroe,strge;if(!npRecordset->BOF)mpRecordset>MoveFirst0:else(AfXMeSSageBOXr表内数据为空”);return;/读入库中各字段并参与列表框中while。m_PReCordset>adoEOF)(Var-m_PReCordSet->GetColIect("Name"):if(var.vt!=VT_NU1.1.)strNa三e=(1.PCSTR)_bstr_t(var):var=m_pRecordset->GetColled(Ae'r):if(var.vt!=VT_NU1.1.)StrAge=(1.PCSTR)_bstr_t(var):m_Access1.ist.AddString(StrNaBe+”*+strAe):m_pRecordset->M<>veNextO:/坡认列表指向第一项,同时移动记录指针并显示m_Access1.ist.SotCurSel(0);)CalChjeon1.error*e)(AfXMeSSageBOX(e->ErrorMessage0);)1插入-记录.可以先用AddNeW()方法新增一个空记录,再用PUtCOlIeCt(字段名,值)输入每个字段的位,最终用UPdaIeo更新到库中数据既可.其中变htmjm和mAge分别为姓名及年龄编辑框的成员变录名.代码所下所示:try(/写入各字段值111.pRecordset->AddNer():mRecordset->PutColIect(*Na11M?",variant_t(m_Name):m>Recordset->PutColled(Age,atol(m_Age):mpRecordset->Update0;AfXMeSSageBoX插入胜利!”):catch(_com_error*e)AfXMeSSageBoX(e->ErrorMessage():)1移动记录指针,移动记录指针可以通过Y。YeFirS1()方法移动到第一条记录、Movc1.ast0方法移动到G终一条记录,MovePreviousO方法移动到当前记录的前一条记录、MoYeNeXtO方法移动到当前记录的下一条记录.但我们行时常常须要随意移动记录指针到随意记录位置时,可以运用乂。"(记录号)方法来实现,留意:MnVe()方法是和时于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3),当前记录是3时,它将从记录3开场往后再移动3条记录位置,代码如卜所示:try(intcurSe1=rnccessl.ist.GetCurSel():/先将指针移向第一条记录,然后就可以相对笫一条记录来随意移动记录指针m_pRecordset->MoveFirst0:mr>Rccordscl->Move(long(curScl):)catch(_com_error«e)(AfxMessageBox(e->ErrorMessage():)修改记录中字段值,uj以将记录指针移动到要修改记录的位置处,F腌用PUtCOIleCt(字段名,值)符新他写入并UPdate()更新数据库既可.可以用上面方法移动记录指针,怪改字段伯代码如下所示:Iry(/假设对其次条记录进展修改m_pRecordset->MoveFirst0;mRccordsct->Movc(l);从O开场mpKecordset->PutCollect(*,a11H>*,variant/(m_Name):m_r»Recordsct->PutColled("rge*',atol(m-Ae);mjecordset->UpdHte();)CatChjCOm_CrrOr«e)(AfxMessageBox(e->ErrorMessage():)1捌除记录。删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,干脆用DeIeteo方法删除它并用IPdate()来更新数据库既可.代码如下所示:try(/暇设删除其次条记录mpRecordset->MoveFirst();m_pRecordset>Delete(adffectCurrent):/参数udFfuCtCUrrent为删除当前记录in_pRccordsel->Updatc();)catch(_com_crrorc)(AfxMessacBx(e->ErrorMvssaoO);)关闭记录集,干脆用ClOSe方法关闭记录集并献于其空值.代码如下所示:,Rccordsct->Close();BjjRecordset=NU1.1.;3.CnnmandPtr智能指针,可以运用ConnectiQnPIr或_ReccrdSetPtr来执行任务,定义输出卷数,执行存储过程或SQ1.语句1 执行SQ1.谙句.先创立一个一COn三andPtr实例指针再将库连接和SQ1.谱句做为参数,执行EXeCUte。方法既可,代码如下所示:CunnandPtrm_pC(xn«and;npComnand.CreateInstance(Uuidof(Coranand): Comand->ActiVcConncctin=m_pConnection;/将库连接忸于它B_pConroand->Co(niiandText="SE1.ECT/FROMDeBoTable*;/SQ1.ifi句 Rccrdset=m_pCo<ninaiid->Execute(Nl1.1.»NU1.1.,adCmcITcxt):/执行SQ1.语句,返回记录集1 执行存储过程.执行存谛过程的操作和上面执行SQ1.谱句类似,不同点仅是COBmandTeXt参数中不再是W1.语句,而是存储过程的名字,如kmo.另一个不同点就是在EXeCUte()中参数由adCmdText(执行SQ1.语句),t为adC三dSToredProc来执行存储过程,假如存储过程中存在输入、输出参数的话,须要运用到另一个智能指针ParamCterPtr来逐次设置要输入、输出的参数信息,并将其赋于COn三ndPtr中ParnIneterS参数来传递信息.有爱好的读者可以行直找相关书籍或MSl*.执行存储过程的代码如下所示:ConeandPtrinCo<11三arl;apCn11nand.Createlnstance(Uuidof(Coinnand):pCornn<nd->ActiVcConnection=11j>Conneclion;/将库连接赋于它pCo11rnand->CcxnaandText="Dem。”:三pComnand->Execule(MI1.1.,NU1.1.adCmdStoredProc);G终,假如想知道具体实现细微环节的话,可以在下税例如源码后.细致查看源码既可(内有具体注耗).