版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
學(xué)習(xí)ADO時(shí)總結(jié)的一些經(jīng)驗(yàn)用ADO操作數(shù)據(jù)庫的方法步驟
ADO接口簡介ADO庫包含三個(gè)基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。_ConnectionPtr接口返回一個(gè)記錄集或一個(gè)空指針。通常使用它來創(chuàng)建一個(gè)數(shù)據(jù)連接或執(zhí)行一條不返回任何結(jié)果的SQL語句,如一個(gè)存儲(chǔ)過程。使用_ConnectionPtr接口返回一個(gè)記錄集不是一個(gè)好的使用方法。通常同Cdatabase一樣,使用它創(chuàng)建一個(gè)數(shù)據(jù)連接,然后使用其它對(duì)象執(zhí)行數(shù)據(jù)輸入輸出操作。
_CommandPtr接口返回一個(gè)記錄集。它提供了一種簡單的方法來執(zhí)行返回記錄集的存儲(chǔ)過程和SQL語句。在使用_CommandPtr接口時(shí),你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用連接串。如果你只執(zhí)行一次或幾次數(shù)據(jù)訪問操作,后者是比較好的選擇。但如果你要頻繁訪問數(shù)據(jù)庫,并要返回很多記錄集,那么,你應(yīng)該使用全局_ConnectionPtr接口創(chuàng)建一個(gè)數(shù)據(jù)連接,然后使用_CommandPtr接口執(zhí)行存儲(chǔ)過程和SQL語句。
_RecordsetPtr是一個(gè)記錄集對(duì)象。與以上兩種對(duì)象相比,它對(duì)記錄集提供了更多的控制功能,如記錄鎖定,游標(biāo)控制等。同_CommandPtr接口一樣,它不一定要使用一個(gè)已經(jīng)創(chuàng)建的數(shù)據(jù)連接,可以用一個(gè)連接串代替連接指針賦給_RecordsetPtr的connection成員變量,讓它自己創(chuàng)建數(shù)據(jù)連接。如果你要使用多個(gè)記錄集,最好的方法是同Command對(duì)象一樣使用已經(jīng)創(chuàng)建了數(shù)據(jù)連接的全局_ConnectionPtr接口,然后使用_RecordsetPtr執(zhí)行存儲(chǔ)過程和SQL語句。
基本流程(1)初始化COM庫,引入ADO庫定義文件(2)用Connection對(duì)象連接數(shù)據(jù)庫(3)利用建立好的連接,通過Connection、Command對(duì)象執(zhí)行SQL命令,或利用Recordset對(duì)象取得結(jié)果記錄集進(jìn)行查詢、處理。(4)使用完畢后關(guān)閉連接釋放對(duì)象。
【1】COM庫的初始化我們可以使用AfxOleInit()來初始化COM庫,這項(xiàng)工作通常在CWinApp::InitInstance()的重載函數(shù)中完成,請(qǐng)看如下代碼:
BOOLCADOTest1App::InitInstance(){
AfxOleInit();
}
【2】用#import指令引入ADO類型庫我們?cè)趕tdafx.h中加入如下語句:#import"c:\programfiles\commonfiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF")其最終作用同我們熟悉的#include類似,編譯的時(shí)候系統(tǒng)會(huì)為我們生成msado15.tlh,ado15.tli兩個(gè)C++頭文件來定義ADO庫。
【3】創(chuàng)建Connection對(duì)象并連接數(shù)據(jù)庫首先我們需要添加一個(gè)指向Connection對(duì)象的指針:
_ConnectionPtrm_pConnection;
BOOLCADOTest1Dlg::OnInitDialog(){
CDialog::OnInitDialog();
try
{
HRESULThr=m_pConnection.CreateInstance("ADODB.Connection");//創(chuàng)建Connection對(duì)象
if(SUCCEEDED(hr))
{
hr=m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=test.mdb","","",adModeUnknown);//連接數(shù)據(jù)庫
//上面一句中連接字串中的Provider是針對(duì)ACCESS2000環(huán)境的,對(duì)于ACCESS97,需要改為:Provider=Microsoft.Jet.OLEDB.3.51;
}
}
}
catch(_com_errore)//COM錯(cuò)誤取得,當(dāng)執(zhí)行COM功能的時(shí)候,如果出錯(cuò),可以捕捉到_com_error的異常
{
CStringstrComError;
strComError.Format("錯(cuò)誤編號(hào):%08lx\n錯(cuò)誤信息:%s\n錯(cuò)誤源:%s\n錯(cuò)誤描述:%s",
e.Error(),
//
錯(cuò)誤編號(hào)
e.ErrorMessage(),
//
錯(cuò)誤信息
(LPCSTR)e.Source(),
//
錯(cuò)誤源
AfxMessageBox(str);
m_pRecordset->Close();
}
catch(_com_errore){...}
在這段代碼中我們只是用Command對(duì)象來執(zhí)行了SELECT查詢語句,Command對(duì)象在進(jìn)行存儲(chǔ)過程的調(diào)用中能真正體現(xiàn)它的作用。下次我們將詳細(xì)介紹。
◆(3)直接用Recordset對(duì)象進(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對(duì)象指針來構(gòu)造一個(gè)_variant_t對(duì)象)
③CursorType光標(biāo)類型,它可以是以下值之一,請(qǐng)看這個(gè)枚舉結(jié)構(gòu):
enumCursorTypeEnum
{
adOpenUnspecified=-1,//不作特別指定
adOpenForwardOnly=0,//前滾靜態(tài)光標(biāo)。這種光標(biāo)只能向前瀏覽記錄集,比如用MoveNext向前滾動(dòng),這種方式可以提高瀏覽速度。但諸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
adOpenKeyset=1,
//采用這種光標(biāo)的記錄集看不到其它用戶的新增、刪除操作,但對(duì)于更新原有記錄的操作對(duì)你是可見的。
adOpenDynamic=2,
//動(dòng)態(tài)光標(biāo)。所有數(shù)據(jù)庫的操作都會(huì)立即在各用戶記錄集上反應(yīng)出來。
adOpenStatic=3
//靜態(tài)光標(biāo)。它為你的記錄集產(chǎn)生一個(gè)靜態(tài)備份,但其它用戶的新增、刪除、更新操作對(duì)你的記錄集來說是不可見的。
};
④LockType鎖定類型,它可以是以下值之一,請(qǐng)看如下枚舉結(jié)構(gòu):
enumLockTypeEnum
{
adLockUnspecified=-1,
//未指定
adLockReadOnly=1,
//只讀記錄集
adLockPessimistic=2,
//悲觀鎖定方式。數(shù)據(jù)在更新時(shí)鎖定其它所有動(dòng)作,這是最安全的鎖定機(jī)制
adLockOptimistic=3,
//樂觀鎖定方式。只有在你調(diào)用Update方法時(shí)才鎖定記錄。在此之前仍然可以做數(shù)據(jù)的更新、插入、刪除等動(dòng)作
adLockBatchOptimistic=4,
//樂觀分批更新。編輯時(shí)記錄不會(huì)鎖定,更改、插入及刪除是在批處理模式下完成。
};
⑤Options請(qǐng)參考本文中對(duì)Connection對(duì)象的Execute方法的介紹
【5】記錄集的遍歷、更新根據(jù)我們剛才通過執(zhí)行SQL命令建立好的
學(xué)生信息
表,它包含四個(gè)字段:學(xué)號(hào),姓名,年齡,生日以下的代碼實(shí)現(xiàn):打開記錄集,遍歷所有記錄,刪除第一條記錄,添加三條記錄,移動(dòng)光標(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é)號(hào)",_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));
//從第一條記錄往下移動(dòng)一條記錄,即移動(dòng)到第二條記錄處
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("錯(cuò)誤編號(hào):%08lx\n錯(cuò)誤信息:%s\n錯(cuò)誤源:%s\n錯(cuò)誤描述:%s"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)人力資源外包協(xié)議書樣本2025年
- 2025年游艇代理權(quán)協(xié)議范本
- 2025年集體工業(yè)廠房經(jīng)營承包協(xié)議
- 2025年創(chuàng)業(yè)投資合伙人合同協(xié)議
- 個(gè)人商業(yè)貸款抵押合同范本
- 上海市共有產(chǎn)權(quán)住宅合同范本
- XX公司防水維修服務(wù)合同
- 二手住宅購買合同范本
- 一對(duì)一PK合同約定
- 小區(qū)車庫出租合同范本
- 2025福建新華發(fā)行(集團(tuán))限責(zé)任公司校園招聘30人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 油氣長輸管道檢查標(biāo)準(zhǔn)清單
- 山東鐵投集團(tuán)招聘筆試沖刺題2025
- 2024年濰坊護(hù)理職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 相交線教學(xué)課件
- 貝克曼梁測定路基路面回彈彎沉
- 機(jī)電安裝施工質(zhì)量標(biāo)準(zhǔn)化實(shí)施圖冊(cè)
- 西藏自治區(qū)建筑與市政工程竣工驗(yàn)收?qǐng)?bào)告
- ge680ct用戶學(xué)習(xí)aw4.6軟件手冊(cè)autobone xpress指南中文
- 2023年高一年級(jí)必修二語文背誦篇目
- 競聘崗位演講評(píng)分表
評(píng)論
0/150
提交評(píng)論