版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)內(nèi)燃機(jī)及配件行業(yè)產(chǎn)銷狀況與未來(lái)需求規(guī)模預(yù)測(cè)報(bào)告
- 2024年家電批發(fā)商銷售合同
- 2024年光伏發(fā)電項(xiàng)目碳排放權(quán)交易合同
- (2024版)全新餐飲店鋪?zhàn)赓U合同書(shū)范本
- 2024年婚前協(xié)議書(shū):婚姻生活準(zhǔn)則
- 2024年工程項(xiàng)目管理與工程承包合同
- 2023年興國(guó)縣教師招聘考試真題
- 2023年天柱縣人民醫(yī)院招聘考試真題
- 2024年工廠自動(dòng)化設(shè)備采購(gòu)協(xié)議
- 2023年菏澤單縣鄉(xiāng)村公益性崗位招聘考試真題
- 傳統(tǒng)節(jié)氣《冬至》課件
- 有多少粘貼畫(huà)教學(xué)設(shè)計(jì)朱菊芬
- 學(xué)會(huì)合理消費(fèi)
- 智能機(jī)器人焊接
- 高三一本“臨界生”動(dòng)員會(huì)課件
- 銷售人員如何列名單與分析名單
- 家長(zhǎng)會(huì)課件:四年級(jí)家長(zhǎng)會(huì)語(yǔ)文老師課件
- 大客戶戰(zhàn)略:大客戶全生命周期管理
- 康得新財(cái)務(wù)審計(jì)案例分析
- 2024屆高考語(yǔ)文復(fù)習(xí):小說(shuō)敘事藝術(shù) 課件39張
- 水利工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(修訂稿)
評(píng)論
0/150
提交評(píng)論