VC++中使用MFC通過(guò)ADO連接數(shù)據(jù)庫(kù)_第1頁(yè)
VC++中使用MFC通過(guò)ADO連接數(shù)據(jù)庫(kù)_第2頁(yè)
VC++中使用MFC通過(guò)ADO連接數(shù)據(jù)庫(kù)_第3頁(yè)
VC++中使用MFC通過(guò)ADO連接數(shù)據(jù)庫(kù)_第4頁(yè)
VC++中使用MFC通過(guò)ADO連接數(shù)據(jù)庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、MFC中用ADO連接數(shù)據(jù)庫(kù)  (2012-04-12 15:50:06)標(biāo)簽: mfc 雜談分類: MFC一、數(shù)據(jù)庫(kù)操作準(zhǔn)備1、導(dǎo)入ADO動(dòng)態(tài)鏈接庫(kù)   在工程的stdafx.h中加入如下語(yǔ)句:   #import "c:program filescommon filessystemadomsado15.dll" no_namespace   rename("EOF","adoEOF") 

2、0;      這一語(yǔ)句有何作用呢?其最終作用同我們熟悉的#include類似,編譯的時(shí)候系統(tǒng)會(huì)為我們生成msado15.tlh和msado15.tli兩個(gè)C+頭文件來(lái)定義ADO庫(kù),即加載ADO動(dòng)態(tài)庫(kù)(msado15.dll)。        其中,no_namespace表明不使用命名空間,rename("EOF","adoEOF")表明把ADO中用到的EOF改為adoEOF,防止發(fā)生命名沖突。 

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

4、)       AfxEnableControlContainer();       /初始化OLE DLLs       if(!AfxOleInit()                  AfxMessag

5、eBox("初始化OLE DLL失敗!");           Return FALSE;               .        說(shuō)明:也可以在InitInstance中使用:CoInitialize初始化OLE/COM庫(kù)環(huán)境,但

6、須在ExitInitInstance中使用:CoUninitialize釋放占用的COM資源,顯然使用AfxOleInit更為方便。3、連接數(shù)據(jù)庫(kù)     在DocView程序中,通常在應(yīng)用類(App類)中進(jìn)行數(shù)據(jù)庫(kù)的連接。     1)聲明一個(gè)Connection指針          _ConnectionPtr m_pConnection;    &#

7、160;      注:ADO最重要的三個(gè)對(duì)象有三個(gè):連接對(duì)象(Connection)、命令對(duì)象(Command)和記錄集對(duì)象(RecordSet)。在使用這三個(gè)對(duì)象的時(shí)候,需要定義與之相對(duì)應(yīng)的智能指針,分別為_(kāi)ConnectionPtr、_CommandPtr、_RecordsetPtr。                   由上述Connect

8、ionPtr指針的使用步驟可知,和C+中的類指針使用方法一樣,智能指針也要先定義指針變量、創(chuàng)建其實(shí)例(實(shí)例化),然后就可以調(diào)用它的方法和屬性。不同的是,該智能指針最后是自動(dòng)進(jìn)行內(nèi)存釋放的。                    所有的智能指針都是基于_com_ptr_t模板類的,該類封裝了IUnknow接口的3個(gè)方法:QueryInterface、Addref和Release。它具有自動(dòng)計(jì)數(shù)的機(jī)制

9、,即在構(gòu)造對(duì)象時(shí),自動(dòng)為該對(duì)象計(jì)數(shù)加1。析構(gòu)對(duì)象時(shí),自動(dòng)調(diào)用Release方法。(即該類型的指針在使用后不需要手動(dòng)釋放內(nèi)存)(但需要調(diào)用Close方法,關(guān)閉連接或者記錄集)所以智能指針會(huì)使代碼更加簡(jiǎn)潔并且不易出錯(cuò)。      2)創(chuàng)建Connection對(duì)象            m_pConnection.CreateInstance(_uuidof(Connection);   &#

10、160;                   m_pConnection.CreateInstance("ADODB.Connection");           上述兩種方法均可。        

11、    注意:上面調(diào)用_ConnectionPtr接口指針的方法CreateInstance時(shí),用的是“.”而非“->”。       3)設(shè)置連接字符串,以便指定需要的連接             3.1) 使用JET數(shù)據(jù)庫(kù)引擎實(shí)現(xiàn)對(duì)Acess2000類型的數(shù)據(jù)庫(kù)info.mdb的連接CString strSQL="Provider=Mic

12、rosoft.Jet.OLEDB.4.0;Data Source=info.mdb;User ID=admin;Passward=;"或者CString strSQL=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=info.mdb;User ID=admin;Passward=;");             3.2) 使用OLE DB提供者實(shí)現(xiàn)對(duì)SQL Server的標(biāo)準(zhǔn)安全連接串s

13、trConnect=_T("Provider=sqloledb;Data Source=MyServerName;"                       "Initial Catalog=MyDateBaseName;"        

14、60;              "User ID=MyUserName;Password=MyPassword;");例程:strConnection="Provider=SQLOLEDB;DataSource=local;InitialCatalog=DVDRentDB_Data.MDF;"          &#

15、160;                "User ID=sa;Password=820415"m_pConnection->Open(_bstr_t)strSQL,"","",adModeUnknown);或者是在此處不設(shè)置User ID和Password,而直接在Open的第2、3個(gè)參數(shù)中設(shè)置。strConnection="Provider=SQLOLEDB

16、;DataSource=local;InitialCatalog=DVDRentDB_Data.MDF"m_pConnection->Open(_bstr_t)strSQL,"sa","820415",adModeUnknown);注意:上面設(shè)置連接字符串的時(shí)候,如果過(guò)長(zhǎng)需要分行時(shí),則每一行都要加上雙引號(hào),在最后加上分號(hào)即可。如果是本地服務(wù)器,則DataSource=local或本地服務(wù)器名均可若數(shù)據(jù)庫(kù)沒(méi)有設(shè)置密碼,在連接字符串中可以將其省略,但User ID不能省若數(shù)據(jù)庫(kù)和程序文件不在同一文件夾下,直接寫數(shù)據(jù)庫(kù)名即可,在InitialC

17、atalog中不需加上該數(shù)據(jù)庫(kù)的存儲(chǔ)器地址             3.3) 使用OLE DB提供者實(shí)現(xiàn)對(duì)遠(yuǎn)程SQL Server的標(biāo)準(zhǔn)安全連接串strConnect=_T("Provider=sqloledb;Network Library=DBMSSOCN;"               

18、60;        "Data Source=130.120.110.001,1433;"                       "Initial Catalog=MyDateBaseName;"    

19、;                    "User ID=MyUserName;Password=MyPassword;");      4)、使用m_pConnection的Open方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的連接       在ADO的操作中建議使用tr

20、y.catch( )來(lái)捕獲錯(cuò)誤信息,因?yàn)樗袝r(shí)會(huì)經(jīng)常出現(xiàn)一些意想不到的錯(cuò)誤try         m_pConnection->Open( (_bstr_t) strSQL," "," ",adModeUnknown);catch(_com_error e)         /捕捉異常       &#

21、160; CString strError;         strError.Format( "連接數(shù)據(jù)庫(kù)發(fā)生異常! r n錯(cuò)誤信息:%s",e.ErrorMessage( ) );         AfxMessageBox(errormessage);         /顯示錯(cuò)誤信息4、關(guān)閉連

22、接      一般重載App類的ExitInstace( )函數(shù)實(shí)現(xiàn)      調(diào)用m_pConnection的Close方法關(guān)閉連接即可      m_pConnection->Close( );      m_pConnection=NULL;      注意:由于初始化COM庫(kù)調(diào)用的是A

23、fxOleInit,這種方法初始化COM庫(kù)的優(yōu)點(diǎn)就在于資源   的釋放也是自動(dòng)進(jìn)行的,所以不必?fù)?dān)心資源泄漏的問(wèn)題。二、數(shù)據(jù)庫(kù)操作       ADO庫(kù)中包含的三個(gè)基本接口為_(kāi)ConnectionPtr接口、_CommandPtr接口、_RecordsetPtr接口。      1、_ConnectionPtr接口          

24、60; 該接口返回一個(gè)記錄集或一個(gè)空指針。            通常用它來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接,或執(zhí)行一條不返回任何結(jié)果的SQL語(yǔ)句,如一個(gè)存儲(chǔ)過(guò)程。            不推薦使用_ConnectionPtr接口返回一個(gè)記錄集,對(duì)于要返回記錄集的操作通常用_RecordsetPtr來(lái)實(shí)現(xiàn),而且使用_ConnectionPtr時(shí)要想得到記錄數(shù)目必

25、須遍歷所有記錄,但使用_RecordsetPtr時(shí)則不需要。     2、_CommandPtr接口      該接口返回一個(gè)記錄集。      它提供了一種簡(jiǎn)單的方法來(lái)執(zhí)行返回記錄集的存儲(chǔ)過(guò)程和SQL語(yǔ)句。      在使用_CommandPtr接口時(shí),可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用連接串。如果只執(zhí)行一次或

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

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

28、160;      使用Recordset對(duì)象操作數(shù)據(jù)庫(kù):       假定已經(jīng)成功使用Connection對(duì)象創(chuàng)建了數(shù)據(jù)源的連接,連接指針為m_pConnection。       1)創(chuàng)建記錄集              聲明記錄集指針 

29、0;      _RecordsetPtr    m_pRecordset;              創(chuàng)建記錄集               m_pRecordset.CreateInstance(_uuid

30、of(Recordset);       2)打開(kāi)記錄集               記錄集指針創(chuàng)建完畢后,調(diào)用該指針的Open方法打開(kāi)記錄集。               該函數(shù)聲明如下:   &#

31、160;                             HRESULT Recordset15:Open ( const _variant_t & Source,           

32、;                                                  

33、;                             const _variant_t & ActiveConnection,              &

34、#160;                                                 &

35、#160;                         enum CursorTypeEnum CursorType,                   

36、                                                  

37、                     enum LockTypeEnum LockType,                        

38、60;                                                 

39、60;               long Options ) ;               各個(gè)參數(shù)的含義如下:               &

40、#160;參數(shù)Source:為_(kāi)variant_t類型的引用,可以為有效的Command對(duì)象、SQL語(yǔ)句、表名、存儲(chǔ)過(guò)程調(diào)用等。                參數(shù)ActiveConnection:為_(kāi)variant_t類型的引用,為已經(jīng)建立好的連接。               參數(shù)Cu

41、rsorType:用于設(shè)置在打開(kāi)Recordset時(shí)提供者應(yīng)使用的游標(biāo)類型,它可取CursorTypeEnum 中的任一值,默認(rèn)值為adOpenForwardOnly。               參數(shù) LockType:用于設(shè)置在打開(kāi)Recordset時(shí)提供者應(yīng)使用的鎖定類型,它可取枚舉LockTypeEnum中的任一值,默認(rèn)值為adLockReadOnly。       &

42、#160;       參數(shù) Options:用于設(shè)置獲取Source(即Open第一個(gè)參數(shù))的方式,其類型long。       例程1: CString strSQL = "select * from mytablename"                

43、0;    m_pRecordset->Open ( _variant_t (strSQL),                                      &#

44、160;                       m_pConnection.GetInterfacePtr( ),                     

45、;                                          adOpenDynamic,     

46、60;                                                 

47、60;       adLockOptimistic,                                       

48、0;                       adCmdText ) ;              使用SQL語(yǔ)句作為Open方法的第一個(gè)參數(shù)Source的值,此時(shí)Options為adCmdText  &#

49、160;    例程2:    m_pRecordset->Open ( _variant_t ("tbDVDInfo") ),                              

50、60;                                  m_pConnection.GetInterfacePtr( ),          

51、                                                  

52、      adOpenDynamic,                                         

53、0;                        adLockOptimistic,                       

54、;                                           adCmdTable ) ;    

55、60;             直接使用表名作為第一個(gè)參數(shù),此時(shí)Options應(yīng)為adCmdTable       3)遍歷記錄集        一般在返回記錄集時(shí),通常要遍歷結(jié)果記錄集,以便查看或編輯某一條記錄,Recoreset指針提供了幾個(gè)用于實(shí)現(xiàn)遍歷的方法。    

56、60;  注意:為 了避免發(fā)生異常,一般在使用MoveFirst、MovePrev之前,需要使用記錄集的指針BOF屬性來(lái)檢測(cè)當(dāng)前的記錄集指針是否位于第一條記錄之前; 在使用MoveLast、MoveNext之前需要使用記錄集指針的EOF屬性來(lái)檢測(cè)當(dāng)前的記錄集指針是否位于最后一條記錄之后。       4)記錄集定位            記錄集接口類提供了兩種定位方法:絕對(duì)定位和書(shū)簽定位

57、            前者通過(guò)設(shè)置或者獲取AbsolutePosition屬性即可,其值從1開(kāi)始,并且當(dāng)前記錄為記錄集中第一條記錄時(shí)等于1            對(duì)于后者可以通過(guò)設(shè)置或獲取BookMark屬性即可       5)訪問(wèn)記錄集    

58、        最簡(jiǎn)單的方法是直接使用如下語(yǔ)句:            m_pRecordset->GetCollect (字段名);            設(shè)置字段值:        

59、0;   m_pRecordset->PutCollect (字段名,新值);兩個(gè)方法的原型:_variant_t GetCollect ( const _variant_t & Index )void PutCollect ( const _variant_t & Index , const _variant_t &pvar )其中:參數(shù)Index可以是字符串表示字段名,也可以是整型,表示字段對(duì)應(yīng)的序號(hào)。           

60、; pvar表示要寫入的變量值。例如:         _variant_t var;         var=m_pRentRecordset->GetCollect("ID");         var=m_pRentRecordset->GetCollect(long(0);   都可以       6)記錄集更新         

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論