




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
學習ADO時總結(jié)的一些經(jīng)驗用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ù)庫,并要返回很多記錄集,那么,你應該使用全局_ConnectionPtr接口創(chuàng)建一個數(shù)據(jù)連接,然后使用_CommandPtr接口執(zhí)行存儲過程和SQL語句。
_RecordsetPtr是一個記錄集對象。與以上兩種對象相比,它對記錄集提供了更多的控制功能,如記錄鎖定,游標控制等。同_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é)果記錄集進行查詢、處理。(4)使用完畢后關閉連接釋放對象。
【1】COM庫的初始化我們可以使用AfxOleInit()來初始化COM庫,這項工作通常在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錯誤取得,當執(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對象在進行存儲過程的調(diào)用中能真正體現(xiàn)它的作用。下次我們將詳細介紹。
◆(3)直接用Recordset對象進行查詢?nèi)〉糜涗浖?/p>
m_pRecordset->Open("SELECT*FROM學生信息",_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光標類型,它可以是以下值之一,請看這個枚舉結(jié)構(gòu):
enumCursorTypeEnum
{
adOpenUnspecified=-1,//不作特別指定
adOpenForwardOnly=0,//前滾靜態(tài)光標。這種光標只能向前瀏覽記錄集,比如用MoveNext向前滾動,這種方式可以提高瀏覽速度。但諸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
adOpenKeyset=1,
//采用這種光標的記錄集看不到其它用戶的新增、刪除操作,但對于更新原有記錄的操作對你是可見的。
adOpenDynamic=2,
//動態(tài)光標。所有數(shù)據(jù)庫的操作都會立即在各用戶記錄集上反應出來。
adOpenStatic=3
//靜態(tài)光標。它為你的記錄集產(chǎn)生一個靜態(tài)備份,但其它用戶的新增、刪除、更新操作對你的記錄集來說是不可見的。
};
④LockType鎖定類型,它可以是以下值之一,請看如下枚舉結(jié)構(gòu):
enumLockTypeEnum
{
adLockUnspecified=-1,
//未指定
adLockReadOnly=1,
//只讀記錄集
adLockPessimistic=2,
//悲觀鎖定方式。數(shù)據(jù)在更新時鎖定其它所有動作,這是最安全的鎖定機制
adLockOptimistic=3,
//樂觀鎖定方式。只有在你調(diào)用Update方法時才鎖定記錄。在此之前仍然可以做數(shù)據(jù)的更新、插入、刪除等動作
adLockBatchOptimistic=4,
//樂觀分批更新。編輯時記錄不會鎖定,更改、插入及刪除是在批處理模式下完成。
};
⑤Options請參考本文中對Connection對象的Execute方法的介紹
【5】記錄集的遍歷、更新根據(jù)我們剛才通過執(zhí)行SQL命令建立好的
學生信息
表,它包含四個字段:學號,姓名,年齡,生日以下的代碼實現(xiàn):打開記錄集,遍歷所有記錄,刪除第一條記錄,添加三條記錄,移動光標到第二條記錄,更改其年齡,保存到數(shù)據(jù)庫。
try
{
_variant_t
vUsername,vBirthday,vID,vOld;
_RecordsetPtr
m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT*FROM學生信息",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)
{
vID=
m_pRecordset->GetCollect(_variant_t((long)0));
//取得第1列的值,從0開始計數(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);
//刪除當前記錄
for(inti=0;i<3;i++)
//添加三條新記錄并賦值
{
m_pRecordset->AddNew();
//添加新記錄
m_pRecordset->PutCollect("學號",_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】關閉記錄集與連接記錄集或連接都可以用Close方法來關閉
m_pRecordset->Close();//關閉記錄集
m_pConnection->Close();//關閉連接
在stdafx.h中進行宏定義:#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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2019-2025年一級建造師之一建市政公用工程實務提升訓練試卷A卷附答案
- 2025年初級經(jīng)濟師之初級建筑與房地產(chǎn)經(jīng)濟??碱A測題庫(奪冠系列)
- 2025年度二月份建筑裝飾工程AI設計施工協(xié)同協(xié)議
- 2025新版城市建設用地使用權(quán)轉(zhuǎn)讓合同
- 2025年度購銷合同模板
- 農(nóng)資銷售合同樣本
- 機場急救飛行通訊稿
- 2025年個人抵押借款合同模板
- 國際視野社團培養(yǎng)全球思維計劃
- 2025個人借款抵押合同范本
- 藍豆云:2024酒店質(zhì)檢SOP及質(zhì)檢報告
- 云南省昭通市鎮(zhèn)雄縣2024年小升初數(shù)學自主招生備考卷含解析
- 車間劃線執(zhí)行標準
- 2023學校幼兒園懷舊“六一兒童節(jié)”(時光不老追憶童年)主題游園活動策劃案-47P
- 幼兒園課件《膽小先生》
- 校服供貨服務方案
- 2024年湖南省懷化市中考數(shù)學一模試卷(含解析)
- 內(nèi)鏡檢查穿孔的應急預案
- TB10001-2016 鐵路路基設計規(guī)范
- 2024年上海市中考語文備考之現(xiàn)代文閱讀作家明前茶及梁曉聲相關閱讀訓練
- 形勢與政策:“一國兩制”與祖國統(tǒng)一系列專題智慧樹知到期末考試答案2024年
評論
0/150
提交評論