版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度體育賽事運(yùn)營管理場規(guī)則與格式規(guī)范3篇
- 二零二四年度一致行動人文化旅游產(chǎn)業(yè)合作協(xié)議合同3篇
- 2025年水電安裝工程設(shè)備采購與安裝合同6篇
- 2025賓館與旅游公司聯(lián)合運(yùn)營客房租賃合同范本2篇
- 2024物流企業(yè)稅收優(yōu)惠適用合同
- 2025年度充電樁充電樁項(xiàng)目融資與投資合同3篇
- 2025廠房買賣合同模板:工業(yè)地產(chǎn)投資合作框架3篇
- 2025年度龍門吊拆除設(shè)備再利用及資源化利用合同范本4篇
- 2025年度裝飾藝術(shù)玻璃定制銷售合同3篇
- 二零二四年倉儲物流中心停車場租賃及倉儲服務(wù)合同3篇
- 公司SWOT分析表模板
- 小學(xué)預(yù)防流行性感冒應(yīng)急預(yù)案
- 肺癌術(shù)后出血的觀察及護(hù)理
- 聲紋識別簡介
- 生物醫(yī)藥大數(shù)據(jù)分析平臺建設(shè)-第1篇
- 基于Android的天氣預(yù)報系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 沖鋒舟駕駛培訓(xùn)課件
- 美術(shù)家協(xié)會會員申請表
- 聚合收款服務(wù)流程
- 中石化浙江石油分公司中石化溫州靈昆油庫及配套工程項(xiàng)目環(huán)境影響報告書
- 搞笑朗誦我愛上班臺詞
評論
0/150
提交評論