學(xué)習(xí)ADO時總結(jié)的一些經(jīng)驗(yàn)_第1頁
學(xué)習(xí)ADO時總結(jié)的一些經(jīng)驗(yàn)_第2頁
學(xué)習(xí)ADO時總結(jié)的一些經(jīng)驗(yàn)_第3頁
學(xué)習(xí)ADO時總結(jié)的一些經(jīng)驗(yàn)_第4頁
學(xué)習(xí)ADO時總結(jié)的一些經(jīng)驗(yàn)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

學(xué)習(xí)ADO時總結(jié)的一些經(jīng)驗(yàn)用ADO操作數(shù)據(jù)庫的方法步驟

ADO接口簡介ADO庫包含三個基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。_ConnectionPtr接口返回一個記錄集或一個空指針。通常使用它來創(chuàng)建一個數(shù)據(jù)連接或執(zhí)行一條不返回任何結(jié)果的SQL語句,如一個存儲過程。使用_ConnectionPtr接口返回一個記錄集不是一個好的使用方法。通常同Cdatabase一樣,使用它創(chuàng)建一個數(shù)據(jù)連接,然后使用其它對象執(zhí)行數(shù)據(jù)輸入輸出操作。

_CommandPtr接口返回一個記錄集。它提供了一種簡單的方法來執(zhí)行返回記錄集的存儲過程和SQL語句。在使用_CommandPtr接口時,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用連接串。如果你只執(zhí)行一次或幾次數(shù)據(jù)訪問操作,后者是比較好的選擇。但如果你要頻繁訪問數(shù)據(jù)庫,并要返回很多記錄集,那么,你應(yīng)該使用全局_ConnectionPtr接口創(chuàng)建一個數(shù)據(jù)連接,然后使用_CommandPtr接口執(zhí)行存儲過程和SQL語句。

_RecordsetPtr是一個記錄集對象。與以上兩種對象相比,它對記錄集提供了更多的控制功能,如記錄鎖定,游標(biāo)控制等。同_CommandPtr接口一樣,它不一定要使用一個已經(jīng)創(chuàng)建的數(shù)據(jù)連接,可以用一個連接串代替連接指針賦給_RecordsetPtr的connection成員變量,讓它自己創(chuàng)建數(shù)據(jù)連接。如果你要使用多個記錄集,最好的方法是同Command對象一樣使用已經(jīng)創(chuàng)建了數(shù)據(jù)連接的全局_ConnectionPtr接口,然后使用_RecordsetPtr執(zhí)行存儲過程和SQL語句。

基本流程(1)初始化COM庫,引入ADO庫定義文件(2)用Connection對象連接數(shù)據(jù)庫(3)利用建立好的連接,通過Connection、Command對象執(zhí)行SQL命令,或利用Recordset對象取得結(jié)果記錄集進(jìn)行查詢、處理。(4)使用完畢后關(guān)閉連接釋放對象。

【1】COM庫的初始化我們可以使用AfxOleInit()來初始化COM庫,這項(xiàng)工作通常在CWinApp::InitInstance()的重載函數(shù)中完成,請看如下代碼:

BOOLCADOTest1App::InitInstance(){

AfxOleInit();

}

【2】用#import指令引入ADO類型庫我們在stdafx.h中加入如下語句:#import"c:\programfiles\commonfiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF")其最終作用同我們熟悉的#include類似,編譯的時候系統(tǒng)會為我們生成msado15.tlh,ado15.tli兩個C++頭文件來定義ADO庫。

【3】創(chuàng)建Connection對象并連接數(shù)據(jù)庫首先我們需要添加一個指向Connection對象的指針:

_ConnectionPtrm_pConnection;

BOOLCADOTest1Dlg::OnInitDialog(){

CDialog::OnInitDialog();

try

{

HRESULThr=m_pConnection.CreateInstance("ADODB.Connection");//創(chuàng)建Connection對象

if(SUCCEEDED(hr))

{

hr=m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=test.mdb","","",adModeUnknown);//連接數(shù)據(jù)庫

//上面一句中連接字串中的Provider是針對ACCESS2000環(huán)境的,對于ACCESS97,需要改為:Provider=Microsoft.Jet.OLEDB.3.51;

}

}

}

catch(_com_errore)//COM錯誤取得,當(dāng)執(zhí)行COM功能的時候,如果出錯,可以捕捉到_com_error的異常

{

CStringstrComError;

strComError.Format("錯誤編號:%08lx\n錯誤信息:%s\n錯誤源:%s\n錯誤描述:%s",

e.Error(),

//

錯誤編號

e.ErrorMessage(),

//

錯誤信息

(LPCSTR)e.Source(),

//

錯誤源

AfxMessageBox(str);

m_pRecordset->Close();

}

catch(_com_errore){...}

在這段代碼中我們只是用Command對象來執(zhí)行了SELECT查詢語句,Command對象在進(jìn)行存儲過程的調(diào)用中能真正體現(xiàn)它的作用。下次我們將詳細(xì)介紹。

◆(3)直接用Recordset對象進(jìn)行查詢?nèi)〉糜涗浖?/p>

m_pRecordset->Open("SELECT*FROM學(xué)生信息",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);Open方法的原型是這樣的:HRESULTRecordset15::Open(const_variant_t&

Source,

const_variant_t&

ActiveConnection,enumCursorTypeEnum

CursorType,enumLockTypeEnum

LockType,long

Options

)其中:

①Source是數(shù)據(jù)查詢字符串

②ActiveConnection是已經(jīng)建立好的連接(我們需要用Connection對象指針來構(gòu)造一個_variant_t對象)

③CursorType光標(biāo)類型,它可以是以下值之一,請看這個枚舉結(jié)構(gòu):

enumCursorTypeEnum

{

adOpenUnspecified=-1,//不作特別指定

adOpenForwardOnly=0,//前滾靜態(tài)光標(biāo)。這種光標(biāo)只能向前瀏覽記錄集,比如用MoveNext向前滾動,這種方式可以提高瀏覽速度。但諸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用

adOpenKeyset=1,

//采用這種光標(biāo)的記錄集看不到其它用戶的新增、刪除操作,但對于更新原有記錄的操作對你是可見的。

adOpenDynamic=2,

//動態(tài)光標(biāo)。所有數(shù)據(jù)庫的操作都會立即在各用戶記錄集上反應(yīng)出來。

adOpenStatic=3

//靜態(tài)光標(biāo)。它為你的記錄集產(chǎn)生一個靜態(tài)備份,但其它用戶的新增、刪除、更新操作對你的記錄集來說是不可見的。

};

④LockType鎖定類型,它可以是以下值之一,請看如下枚舉結(jié)構(gòu):

enumLockTypeEnum

{

adLockUnspecified=-1,

//未指定

adLockReadOnly=1,

//只讀記錄集

adLockPessimistic=2,

//悲觀鎖定方式。數(shù)據(jù)在更新時鎖定其它所有動作,這是最安全的鎖定機(jī)制

adLockOptimistic=3,

//樂觀鎖定方式。只有在你調(diào)用Update方法時才鎖定記錄。在此之前仍然可以做數(shù)據(jù)的更新、插入、刪除等動作

adLockBatchOptimistic=4,

//樂觀分批更新。編輯時記錄不會鎖定,更改、插入及刪除是在批處理模式下完成。

};

⑤Options請參考本文中對Connection對象的Execute方法的介紹

【5】記錄集的遍歷、更新根據(jù)我們剛才通過執(zhí)行SQL命令建立好的

學(xué)生信息

表,它包含四個字段:學(xué)號,姓名,年齡,生日以下的代碼實(shí)現(xiàn):打開記錄集,遍歷所有記錄,刪除第一條記錄,添加三條記錄,移動光標(biāo)到第二條記錄,更改其年齡,保存到數(shù)據(jù)庫。

try

{

_variant_t

vUsername,vBirthday,vID,vOld;

_RecordsetPtr

m_pRecordset;

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open("SELECT*FROM學(xué)生信息",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

while(!m_pRecordset->adoEOF)

{

vID=

m_pRecordset->GetCollect(_variant_t((long)0));

//取得第1列的值,從0開始計(jì)數(shù),你也可以直接給出列的名稱,如下一行

vUsername=m_pRecordset->GetCollect("姓名");

//取得姓名字段的值

vOld=m_pRecordset->GetCollect("年齡");

vBirthday=m_pRecordset->GetCollect("生日");

TRACE("id:%d,姓名:%s,年齡:%d,生日:%s\r\n",

vID.lVal,

(LPCTSTR)(_bstr_t)vUsername,

vOld.lVal,

(LPCTSTR)(_bstr_t)vBirthday);

//在DEBUG方式下的OUTPUT窗口輸出記錄集中的記錄

m_pRecordset->MoveNext();

//移到下一條記錄

}

m_pRecordset->MoveFirst();

//移到首條記錄

m_pRecordset->Delete(adAffectCurrent);

//刪除當(dāng)前記錄

for(inti=0;i<3;i++)

//添加三條新記錄并賦值

{

m_pRecordset->AddNew();

//添加新記錄

m_pRecordset->PutCollect("學(xué)號",_variant_t((long)(i+10)));

m_pRecordset->PutCollect("姓名",_variant_t("王斌年"));

m_pRecordset->PutCollect("年齡",_variant_t((long)21));

m_pRecordset->PutCollect("生日",_variant_t("1930-3-15"));

}

m_pRecordset->Move(1,_variant_t((long)adBookmarkFirst));

//從第一條記錄往下移動一條記錄,即移動到第二條記錄處

m_pRecordset->PutCollect(_variant_t("年齡"),_variant_t((long)45));

//修改其年齡

m_pRecordset->Update();

//保存到庫中

}catch(_com_errore){}

【6】關(guān)閉記錄集與連接記錄集或連接都可以用Close方法來關(guān)閉

m_pRecordset->Close();//關(guān)閉記錄集

m_pConnection->Close();//關(guān)閉連接

在stdafx.h中進(jìn)行宏定義:#if!definedCATCH_ERROR#defineCATCH_ERROR

\

{

\

CStringstrComError;

\

strComError.Format("錯誤編號:%08lx\n錯誤信息:%s\n錯誤源:%s\n錯誤描述:%s"

溫馨提示

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

評論

0/150

提交評論