mfc連接數(shù)據(jù)庫(kù)_第1頁(yè)
mfc連接數(shù)據(jù)庫(kù)_第2頁(yè)
mfc連接數(shù)據(jù)庫(kù)_第3頁(yè)
mfc連接數(shù)據(jù)庫(kù)_第4頁(yè)
mfc連接數(shù)據(jù)庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、MFC中用Ado連接數(shù)據(jù)庫(kù)一、數(shù)據(jù)庫(kù)操作準(zhǔn)備1、導(dǎo)入ADO動(dòng)態(tài)鏈接庫(kù)在工程的stdafx.h中加入如下語(yǔ)句:#importc:programfilescommonfilessystemadomsado15.dllno_namespacerename(EOF,adoEOF)這一語(yǔ)句有何作用呢?其最終作用同我們熟悉的#inelude類似,編譯的時(shí)候系統(tǒng)會(huì)為我們生成msado15.tlh和msado15.tli兩個(gè)C+頭文件來定義ADO庫(kù),即加載ADO動(dòng)態(tài)庫(kù)(msado15.dll)。其中,no_namespace表明不使用命名空間,rename(EOF,adoEOF)表明把ADO中用到的EOF改為

2、adoEOF,防止發(fā)生命名沖突。注意:該代碼需要在一行中完成,如果寫成兩行或者多行,行末要加上“”符號(hào),表示把這幾行看成一行,如本例。2、初始化OLE/COM庫(kù)環(huán)境在基于MFC的應(yīng)用里,初始化OLE/COM庫(kù)環(huán)境的一個(gè)比較好的位置是在應(yīng)用類的Initlnstanee成員函數(shù)中,而且直接使用AfxOleInit,在退出應(yīng)用時(shí),該函數(shù)也負(fù)責(zé)COM資源的釋放,將此函數(shù)添加在Initlnstanee中的如下位置:BOOLCExpApp:InitInstanee()AfxEnableControlContainer();/初始化OLEDLLsif(!AfxOleInit()AfxMessageBox(初

3、始化OLEDLL失敗!);ReturnFALSE;說明:也可以在Initlnstanee中使用:Colnitialize初始化OLE/COM庫(kù)環(huán)境,但須在ExitInitlnstanee中使用:CoUninitialize釋放占用的COM資源,顯然使用AfxOleInit更為方便。3、連接數(shù)據(jù)庫(kù)在DocView程序中,通常在應(yīng)用類(App類)中進(jìn)行數(shù)據(jù)庫(kù)的連接。1)聲明一個(gè)Conneetion指針_ConnectionPtrm_pConnection;注:ADO最重要的三個(gè)對(duì)象有三個(gè):連接對(duì)象(Connection)、命令對(duì)象(Command)和記錄集對(duì)象(RecordSet)。在使用這三個(gè)對(duì)

4、象的時(shí)候,需要定義與之相對(duì)應(yīng)的智能指針,分別為_ConnectionPtr、_CommandPtr、RecordsetPtr。由上述ConnectionPtr指針的使用步驟可知,和C+中的類指針使用方法一樣,智能指針也要先定義指針變量、創(chuàng)建其實(shí)例(實(shí)例化),然后就可以調(diào)用它的方法和屬性。不同的是,該智能指針最后是自動(dòng)進(jìn)行內(nèi)存釋放的。所有的智能指針都是基于_com_ptr_t模板類的,該類封裝了lUnknow接口的3個(gè)方法:Querylnterface、Addref和Releaseo它具有自動(dòng)計(jì)數(shù)的機(jī)制,即在構(gòu)造對(duì)象時(shí),自動(dòng)為該對(duì)象計(jì)數(shù)加1。析構(gòu)對(duì)象時(shí),自動(dòng)調(diào)用Release方法。(即該類型的指

5、針在使用后不需要手動(dòng)釋放內(nèi)存)(但需要調(diào)用Close方法,關(guān)閉連接或者記錄集)所以智能指針會(huì)使代碼更加簡(jiǎn)潔并且不易出錯(cuò)。2)創(chuàng)建Connection對(duì)象m_pConnection.Createlnstance(_uuidof(Connection);m_pConnection.Createlnstance(ADODB.Connection);上述兩種方法均可。注意:上面調(diào)用_ConnectionPtr接口指針的方法CreateInstanee時(shí),用的是“.”而非ii7,“-”。3)設(shè)置連接字符串,以便指定需要的連接使用JET數(shù)據(jù)庫(kù)引擎實(shí)現(xiàn)對(duì)Acess2000類型的數(shù)據(jù)庫(kù)info.mdb的連接C

6、StringstrSQL=Provider=Microsoft.Jet.OLEDB.4.0;DataSource=info.mdb;UserID=admin;Passward=;或者CStringstrSQL=_T(Provider=Microsoft.Jet.OLEDB.4.0;DataSource=info.mdb;UserID=admin;Passward=;);使用OLEDB提供者實(shí)現(xiàn)對(duì)SQLServer的標(biāo)準(zhǔn)安全連接串strConnect=_T(Provider=sqloledb;DataSource=MyServerName;InitialCatalog=MyDateBaseNam

7、e;UserID=MyUserName;Password=MyPassword;);例程:strConnection=Provider=SQLOLEDB;DataSource=local;InitialCatalog=DVDRentDB_Data.MDF;UserID=sa;Password=820415;m_pConnection-Open(_bstr_t)strSQL,adModeUnknown);或者是在此處不設(shè)置UserID和Password,而直接在Open的第2、3個(gè)參數(shù)中設(shè)置。strConnection=Provider=SQLOLEDB;DataSource=local;Ini

8、tialCatalog=DVDRentDB_Data.MDF;m_pConnection-Open(_bstr_t)strSQL,sa,820415,adModeUnknown);注意:上面設(shè)置連接字符串的時(shí)候,如果過長(zhǎng)需要分行時(shí),則每一行都要加上雙引號(hào),在最后加上分號(hào)即可。如果是本地服務(wù)器,則DataSource=local或本地服務(wù)器名均可若數(shù)據(jù)庫(kù)沒有設(shè)置密碼,在連接字符串中可以將其省略,但UserID不能省若數(shù)據(jù)庫(kù)和程序文件不在同一文件夾下,直接寫數(shù)據(jù)庫(kù)名即可,在InitialCatalog中不需加上該數(shù)據(jù)庫(kù)的存儲(chǔ)器地址3.3)使用OLEDB提供者實(shí)現(xiàn)對(duì)遠(yuǎn)程SQLServer的標(biāo)準(zhǔn)安全連

9、接串strConnect=_T(Provider=sqloledb;NetworkLibrary=DBMSSOCN;DataSource=130.120.110.001,1433;InitialCatalog=MyDateBaseName;UserID=MyUserName;Password=MyPassword;);4)、使用m_pConnection的Open方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的連接在ADO的操作中建議使用try.catch()來捕獲錯(cuò)誤信息,因?yàn)樗袝r(shí)會(huì)經(jīng)常出現(xiàn)一些意想不到的錯(cuò)誤trym_pConnection-Open(_bstr_t)strSQL,adModeUnknown);catc

10、h(_com_errore)/捕捉異常CStringstrError;strError.Format(連接數(shù)據(jù)庫(kù)發(fā)生異常!rn錯(cuò)誤信息:s”,e.ErrorMessage();AfxMessageBox(errormessage);/顯示錯(cuò)誤信息4、關(guān)閉連接一般重載App類的ExitInstace()函數(shù)實(shí)現(xiàn)調(diào)用m_pConnection的Close方法關(guān)閉連接即可m_pConnection-Close();m_pConnection=NULL;注意:由于初始化COM庫(kù)調(diào)用的是AfxOleInit,這種方法初始化COM庫(kù)的優(yōu)點(diǎn)就在于資源的釋放也是自動(dòng)進(jìn)行的,所以不必?fù)?dān)心資源泄漏的問題。二、數(shù)據(jù)

11、庫(kù)操作ADO庫(kù)中包含的三個(gè)基本接口為_ConnectionPtr接口、_CommandPtr接口、_RecordsetPtr接口。1、_ConnectionPtr接口該接口返回一個(gè)記錄集或一個(gè)空指針。通常用它來創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接,或執(zhí)行一條不返回任何結(jié)果的SQL語(yǔ)句,如一個(gè)存儲(chǔ)過程。不推薦使用_ConnectionPtr接口返回一個(gè)記錄集,對(duì)于要返回記錄集的操作通常用_RecordsetPtr來實(shí)現(xiàn),而且使用_ConnectionPtr時(shí)要想得到記錄數(shù)目必須遍歷所有記錄,但使用_RecordsetPtr時(shí)則不需要。2、_CommandPtr接口該接口返回一個(gè)記錄集。它提供了一種簡(jiǎn)單的方法來執(zhí)行

12、返回記錄集的存儲(chǔ)過程和SQL語(yǔ)句。在使用_CommandPtr接口時(shí),可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用連接串。如果只執(zhí)行一次或者幾次數(shù)據(jù)庫(kù)訪問操作,后者是比較好的選擇。但是,如果頻繁訪問數(shù)據(jù)庫(kù),并要返回很多記錄集,那么應(yīng)該使用全局_ConnectionPtr接口創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接,然后使用_CommandPtr接口執(zhí)行存儲(chǔ)過程和SQL語(yǔ)句。3、_RecordsetPtr接口該接口是一個(gè)記錄集對(duì)象。與前兩種對(duì)象相比,它對(duì)記錄集提供了更多的控制功能,如記錄鎖定、游標(biāo)控制等。同_CommandPtr接口一樣,它不一定要使用一個(gè)已經(jīng)創(chuàng)建的數(shù)據(jù)庫(kù)

13、連接,可以用一個(gè)連接串代替連接指針賦給_RecordsetPtr的connection成員變量,讓它自己創(chuàng)建數(shù)據(jù)庫(kù)連接。如果使用多個(gè)記錄集,最好的方法是同Command對(duì)象一樣使用已經(jīng)創(chuàng)建了數(shù)據(jù)連接的全局_ConnectionPtr接口,然后使用RecordsetPtr執(zhí)行存儲(chǔ)過程和SQL語(yǔ)句。注意:可以使用Recordset對(duì)象來執(zhí)行查詢命令,但如果查詢或者存儲(chǔ)過程是需要參數(shù)的,這時(shí)就只能使用Command對(duì)象。使用Recordset對(duì)象操作數(shù)據(jù)庫(kù):假定已經(jīng)成功使用Connection對(duì)象創(chuàng)建了數(shù)據(jù)源的連接,連接指針為m_pConnection。創(chuàng)建記錄集聲明記錄集指針_RecordsetP

14、trm_pRecordset;創(chuàng)建記錄集m_pRecordset.CreateInstance(_uuidof(Recordset);打開記錄集記錄集指針創(chuàng)建完畢后,調(diào)用該指針的Open方法打開記錄集。該函數(shù)聲明如下:HRESULTRecordset15:Open(const_variant_t&Source,const_variant_t&ActiveConnection,enumCursorTypeEnumCursorType,enumLockTypeEnumLockType,longOptions);各個(gè)參數(shù)的含義如下:參數(shù)Source:為_variant_t類型的引用,可以為有效的Co

15、mmand對(duì)象、SQL語(yǔ)句、表名、存儲(chǔ)過程調(diào)用等。參數(shù)ActiveConnection:為_variant_t類型的引用,為已經(jīng)建立好的連接。參數(shù)CursorType:用于設(shè)置在打開Recordset時(shí)提供者應(yīng)使用的游標(biāo)類型,它可取CursorTypeEnum中的任一值,默認(rèn)值為adOpenForwardOnly。參數(shù)LockType:用于設(shè)置在打開Recordset時(shí)提供者應(yīng)使用的鎖定類型,它可取枚舉LockTypeEnum中的任一值,默認(rèn)值為adLockReadOnly。參數(shù)Options:用于設(shè)置獲取Source(即Open第一個(gè)參數(shù))的方式,其類型Iong。游標(biāo)類空常遺描述adOpen

16、S-tatic般態(tài)游栩,實(shí)他川戶所作的添肛迫戰(zhàn)或刪除不可見adOpenrorraMOnly儀向前掰標(biāo),為默認(rèn)値d大致與曲態(tài)游標(biāo)相同niidOpcnDyruimic動(dòng)態(tài)游標(biāo),實(shí)他j|廣的添加-史改或刪除均可見dOpenKeyset鍵集游標(biāo),不能仿問耳他用戶刪除、添加的記錄adOpenUn&pecified未指定游標(biāo)類世鎖定買型常量說明adLockUnspecified未指定adLockReaclOnly只諛記錄集adLockPcssimist悲觀鎖也數(shù)據(jù)更新時(shí)鎖楚其它所有動(dòng)作adLqckOptimistid樂觀碩定口R/?:illHLpda(c;7ft時(shí)碩址訃艮adLoekBatehOptimi

17、stie妊觀批更新匚需要批更新模黃龍持Options値常a說明adlrndlxt指示提供占應(yīng)該將Source九命會(huì)的文本定義來訃算adCmdTbie指貳ADO主成SQL査詢以便從在Source中命名的表中返回所有ifadCmdTab!eDircct指示提供者更改從住射口兀沖命名的表中返冋所有f丁adCmdStortProc指示提供者應(yīng)該將Sou趙視対存儲(chǔ)過程adCmdlJnknown指示Source參敷中的命令襄報(bào)為水知例程1:CStringstrSQL=select*frommytablename;m_pRecordset-Open(_variant_t(strSQL),m_pConnect

18、ion.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);使用SQL語(yǔ)句作為Open方法的第一個(gè)參數(shù)Source的值,此時(shí)Options為adCmdText例程2:m_pRecordset-Open(_variant_t(tbDVDInfo),使用Recordset對(duì)象操作數(shù)據(jù)庫(kù):m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdTable);直接使用表名作為第一個(gè)參數(shù),此時(shí)Options應(yīng)為adCmdTable遍歷記錄集一般在返回記錄集時(shí)

19、,通常要遍歷結(jié)果記錄集,以便查看或編輯某一條記錄,Recoreset指針提供了幾個(gè)用于實(shí)現(xiàn)遍歷的方法。記錄集遍W成W南數(shù)功能描述Move將記杲集指針移動(dòng)到指定的記錄MoveFirsi將訶錄集摘針移動(dòng)到第一味記萊MovcLast將址錄集指針移動(dòng)刮撼后-條訂錄將記錄集指針移幼到下一條記錄MovePrev將記錄集指針移動(dòng)到pu糸記錄注意:為了避免發(fā)生異常,一般在使用MoveFirst、MovePrev之前,需要使用記錄集的指針BOF屬性來檢測(cè)當(dāng)前的記錄集指針是否位于第一條記錄之前;在使用MoveLast、MoveNext之前需要使用記錄集指針的EOF屬性來檢測(cè)當(dāng)前的記錄集指針是否位于最后一條記錄之后

20、。記錄集定位記錄集接口類提供了兩種定位方法:絕對(duì)定位和書簽定位前者通過設(shè)置或者獲取AbsolutePosition屬性即可,其值從1開始,并且當(dāng)前記錄為記錄集中第一條記錄時(shí)等于1對(duì)于后者可以通過設(shè)置或獲取BookMark屬性即可訪問記錄集最簡(jiǎn)單的方法是直接使用如下語(yǔ)句:m_pRecordset-GetCollect(字段名);設(shè)置字段值:m_pRecordset-PutCollect(字段名,新值);兩個(gè)方法的原型:_variant_tGetCollect(const_variant_t&Index)voidPutCollect(const_variant_t&Index,const_variant_t&pvar)其中:參數(shù)Index可以是字符串表示字段名,也可以是整型,表示字段對(duì)應(yīng)的序號(hào)。pvar表示要寫入的變量值。例如:_variant_tvar;var=m_pRentRe

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論