在Visual C中用ADO進(jìn)行數(shù)據(jù)庫編程_第1頁
在Visual C中用ADO進(jìn)行數(shù)據(jù)庫編程_第2頁
在Visual C中用ADO進(jìn)行數(shù)據(jù)庫編程_第3頁
在Visual C中用ADO進(jìn)行數(shù)據(jù)庫編程_第4頁
在Visual C中用ADO進(jìn)行數(shù)據(jù)庫編程_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、在Visual C+中用ADO進(jìn)行數(shù)據(jù)庫編程C+中用學(xué)習(xí)各種高級(jí)外掛制作技術(shù),馬上去百度搜索"魔鬼作坊",點(diǎn)擊第一個(gè)站進(jìn)入,快速成為做掛達(dá)人。1.生成應(yīng)用程序框架并初始化OLE/COM庫環(huán)境創(chuàng)建一個(gè)標(biāo)準(zhǔn)的MFC AppWizard(exe應(yīng)用程序,然后在使用ADO數(shù)據(jù)庫的InitInstance 函數(shù)中初始化OLE/COM庫(因?yàn)锳DO庫是一個(gè)COM DLL庫。本例為:BOOL CAdotestDlg:OnInitDialog(:CoInitialize(NULL;/初始化OLE/COM庫環(huán)境程序最后要調(diào)用:CoUninitialize(;/釋放程序占用的COM資源。另外:

2、m_pRecordset->Close(;注意!不要多次關(guān)閉!m_pConnection->Close(;m_pRecordset=NULL;m_pConnection=NULL;2.引入ADO庫文件使用ADO前必須在工程的stdafx.h文件最后用直接引入符號(hào)#import引入ADO庫文件,以使編譯器能正確編譯。代碼如下:#import"C:Program Filescommon filessystemadomsado15.dll"no_namespace rename("EOF","adoEOF"程序的第三行指示ADO

3、對(duì)象不使用名稱空間。在有些應(yīng)用程序中,由于應(yīng)用程序中的對(duì)象與ADO中的對(duì)象之間可能會(huì)出現(xiàn)命名沖突,所以有必要使用名稱空間。如果要使用名稱空間,則可把第三行程序修改為:rename_namespace("AdoNS"。第四行代碼將ADO 中的EOF(文件結(jié)束更名為adoEOF,以避免與定義了自己的EOF的其他庫沖突。3.利用智能指針進(jìn)行數(shù)據(jù)庫操作在CaboutDlg頭文件中定義兩個(gè)ADO智能指針類實(shí)例,并在對(duì)話框中加入一個(gè)ListCtrl。class CAdotestDlg:public CDialog_ConnectionPtr m_pConnection;_Records

4、etPtr m_pRecordset;ClistCtrl m_List;.ADO庫包含三個(gè)智能指針:_ConnectionPtr、_CommandPtr和_RecordsetPtr。_ConnectionPtr通常被用來創(chuàng)建一個(gè)數(shù)據(jù)連接或執(zhí)行一條不返回任何結(jié)果的SQL語句,如一個(gè)存儲(chǔ)過程。_CommandPtr返回一個(gè)記錄集。它提供了一種簡(jiǎn)單的方法來執(zhí)行返回記錄集的存儲(chǔ)過程和SQL語句。在使用_CommandPtr接口時(shí),可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用連接串。_RecordsetPtr是一個(gè)記錄集對(duì)象。與以上兩種對(duì)象相比,它對(duì)記錄集提

5、供了更多的控制功能,如記錄鎖定、游標(biāo)控制等。在使用ADO程序的事件響應(yīng)中OnButton1加入以下代碼:void CAdotestDlg:OnButton1(m_List.ResetContent(;m_pConnection.CreateInstance(_uuidof(Connection;/初始化Connection指針m_pRecordset.CreateInstance(_uuidof(Recordset;/初始化Recordset指針trym_pConnection->Open("DSN=ADOTest","",""

6、,0;/連接叫作ADOTest的ODBC數(shù)據(jù)源/注意:這是連接不需要用戶ID或密碼的open函數(shù)/否則形式為->Open("DSN=test;uid=sa;pwd=123;","","",0;/執(zhí)行SQL語句得到一個(gè)記錄集把其指針賦值給m_pRecordsetCString strSql="select*from middle"BSTR bstrSQL=strSql.AllocSysString(;m_pRecordset->Open(bstrSQL,(IDispatch*m_pConnection,a

7、dOpenDynamic,adLockOpti mistic,adCmdText;/adOpenDynamic:動(dòng)態(tài)adLockOptimistic樂觀封鎖法adCmdText:文本查詢語句while(!m_pRecordset->adoEOF/遍歷所有記錄/取紀(jì)錄字段值方式之一_variant_t TheValue;/VARIANT數(shù)據(jù)類型TheValue=m_pRecordset->GetCollect("BIG_NAME"/得到字段BIG_NAME的值if(TheValue.vt!=VT_NULLm_List.AddString(char*_bstr_t(

8、TheValue;/將該值加入到列表控件中/取紀(jì)錄字段值方式之二/_bstr_t TheValue1=m_pRecordset->Fields->GetItem("BIG_NAME"->Value;/CString temp=TheValue1.copy(;/m_List.AddString(temp;/數(shù)據(jù)類型轉(zhuǎn)換_variant_t vUsername,vBirthday,vID,vOld;TRACE("id:%d,姓名:%s,年齡:%d,生日:%srn",vID.lVal,(LPCTSTR(_bstr_tvUsername,vOl

9、d.lVal,(LPCTSTR(_bstr_tvBirthday;m_pRecordset->MoveNext(;/轉(zhuǎn)到下一條紀(jì)錄m_pRecordset->Close(;m_pConnection->Close(;catch(_com_error e/異常處理AfxMessageBox(e.ErrorMessage(;m_pRecordset->Close(;/注意!不要多次關(guān)閉!否則會(huì)出錯(cuò)m_pConnection->Close(;m_pRecordset=NULL;m_pConnection=NULL;程序中通過_variant_t和_bstr_t轉(zhuǎn)換COM

10、對(duì)象和C+類型的數(shù)據(jù),_variant_t類封裝了OLE自治VARIANT數(shù)據(jù)類型。在C+中使用_variant_t類要比直接使用VARIANT數(shù)據(jù)類型容易得多。好,編譯后該程序就能運(yùn)行了,但記住運(yùn)行前要?jiǎng)?chuàng)建一個(gè)叫ADOTest的ODBC數(shù)據(jù)源。該程序?qū)驯韒iddle中的BIG_NAME字段值顯示在列表控件中。4.執(zhí)行SQL命令并取得結(jié)果記錄集為了取得結(jié)果記錄集,我們定義一個(gè)指向Recordset對(duì)象的指針:_RecordsetPtr m_pRecordset;并為其創(chuàng)建Recordset對(duì)象的實(shí)例:m_pRecordset.CreateInstance("ADODB.Record

11、set" SQL命令的執(zhí)行可以采用多種形式,下面我們一進(jìn)行闡述。(1利用Connection對(duì)象的Execute方法執(zhí)行SQL命令Execute方法的原型如下所示:_RecordsetPtr Connection15:Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options其中CommandText是命令字串,通常是SQL命令。參數(shù)RecordsAffected是操作完成后所影響的行數(shù),參數(shù)Options表示CommandText中內(nèi)容的類型,Options可以取如下值之一:adCmdText:表明Comman

12、dText是文本命令adCmdTable:表明CommandText是一個(gè)表名adCmdProc:表明CommandText是一個(gè)存儲(chǔ)過程adCmdUnknown:未知Execute執(zhí)行完后返回一個(gè)指向記錄集的指針,下面我們給出具體代碼并作說明。_variant_t RecordsAffected;/執(zhí)行SQL命令:CREATE TABLE創(chuàng)建表格users,users包含四個(gè)字段:整形ID,字符串username,整形old,日期型birthdaym_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TE

13、XT,old INTEGER,birthday DATETIME",&RecordsAffected,adCmdText;/往表格里面添加記錄m_pConnection->Execute("INSERT INTO users(ID,username,old,birthdayVALUES (1,'Washington',25,'1970/1/1'",&RecordsAffected,adCmdText;/將所有記錄old字段的值加一m_pConnection->Execute("UPDATE us

14、ers SET old= old+1",&RecordsAffected,adCmdText;/執(zhí)行SQL統(tǒng)計(jì)命令得到包含記錄條數(shù)的記錄集m_pRecordset=m_pConnection->Execute("SELECT COUNT(*FROM users",&RecordsAffected,adCmdText;_variant_t vIndex=(long0;_variant_t vCount=m_pRecordset->GetCollect(vIndex;/取得第一個(gè)字段的值放入vCount變量上兩句可以寫成_variant_t

15、 vCount= m_pRecordset->GetCollect(_variant_t(long0;m_pRecordset->Close(;/關(guān)閉記錄集CString message;message.Format("共有%d條記錄",vCount.lVal;AfxMessageBox(message;/顯示當(dāng)前記錄條數(shù)(2利用Command對(duì)象來執(zhí)行SQL命令_CommandPtr m_pCommand;m_pCommand.CreateInstance("ADODB.Command"_variant_t vNULL;vNULL.vt=V

16、T_ERROR;vNULL.scode=DISP_E_PARAMNOTFOUND;/定義為無參數(shù)m_pCommand->ActiveConnection=m_pConnection;/非常關(guān)鍵的一句,將建立的連接賦值給它m_pCommand->CommandText="SELECT*FROM users"/命令字串m_pRecordset=m_pCommand->Execute(&vNULL,&vNULL,adCmdText;/執(zhí)行命令,取得記錄集在這段代碼中我們只是用Command對(duì)象來執(zhí)行了SELECT查詢語句,Command對(duì)象在進(jìn)行

17、存儲(chǔ)過程的調(diào)用中能真正體現(xiàn)它的作用。下次我們將詳細(xì)介紹。(3直接用Recordset對(duì)象進(jìn)行查詢?nèi)〉糜涗浖瘜?shí)例void CGmsaDlg:OnDBSelect(/TODO:Add your control notification handler code here_RecordsetPtr Rs1;/定義Recordset對(duì)象_bstr_t Connect("DSN=GMS;UID=sa;PWD=;"/定義連接字符串_bstr_t Source("SELECT count(*FROM buaa.mdb010"/要執(zhí)行的SQL語句:CoInitializ

18、e(NULL;/初始化Rs1對(duì)象HRESUL hr=Rs1.CreateInstance(_uuidof(Recordset;/省略對(duì)返回值hr的判斷Rs1->Open(Source,Connect,adOpenForwardOnly,adLockReadOnly,-1;_variant_t temp=Rs1->GetCollect(_variant_t(long0;CString strTemp=(char*(_bstr_ttemp;MessageBox("OK!"+strTemp;例如m_pRecordset->Open("SELECT*FR

19、OM users",_variant_t(IDispatch*m_pConnection,true,adOpenStatic,adLockOptimistic,adCmdText;Open方法的原型是這樣的:HRESULT Recordset15:Open(const_variant_t&Source,const_variant_t&ActiveConnection,enum CursorTypeEnum CursorType,enum LockTypeEnum LockType,long Options其中:Source是數(shù)據(jù)查詢字符串ActiveConnectio

20、n是已經(jīng)建立好的連接(我們需要用Connection對(duì)象指針來構(gòu)造一個(gè)_variant_t對(duì)象CursorType光標(biāo)類型,它可以是以下值之一,請(qǐng)看這個(gè)枚舉結(jié)構(gòu):enum CursorTypeEnumadOpenUnspecified=-1,/不作特別指定adOpenForwardOnly=0,/前滾靜態(tài)光標(biāo)。這種光標(biāo)只能向前瀏覽記錄集,比如用MoveNext 向前滾動(dòng),這種方式可以提高瀏覽速度。但諸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用adOpenKeyset=1,/采用這種光標(biāo)的記錄集看不到其它用戶的新增、刪除操作,

21、但對(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):enum LockTypeEnumadLockUnspecified=-1,/未指定adLockReadOnly=1,/只讀記錄集adLockPessimistic=2,悲觀鎖定方式。數(shù)據(jù)在更新時(shí)鎖定其它所有動(dòng)作,這是最安全的鎖定機(jī)制adLockOptimistic=3

22、,樂觀鎖定方式。只有在你調(diào)用Update方法時(shí)才鎖定記錄。在此之前仍然可以做數(shù)據(jù)的更新、插入、刪除等動(dòng)作adLockBatchOptimistic=4,樂觀分批更新。編輯時(shí)記錄不會(huì)鎖定,更改、插入及刪除是在批處理模式下完成。;Options可以取如下值之一:adCmdText:表明CommandText是文本命令adCmdTable:表明CommandText是一個(gè)表名adCmdProc:表明CommandText是一個(gè)存儲(chǔ)過程adCmdUnknown:未知5.記錄集的遍歷、更新根據(jù)我們剛才通過執(zhí)行SQL命令建立好的users表,它包含四個(gè)字段:ID,username,old,birthday

23、以下的代碼實(shí)現(xiàn):打開記錄集,遍歷所有記錄,刪除第一條記錄,添加三條記錄,移動(dòng)光標(biāo)到第二條記錄,更改其年齡,保存到數(shù)據(jù)庫。_variant_t vUsername,vBirthday,vID,vOld;_RecordsetPtr m_pRecordset;m_pRecordset.CreateInstance("ADODB.Recordset"m_pRecordset->Open("SELECT*FROM users",_variant_t(IDispatch*m_pConnection,true,adOpenStatic,adLockOptimis

24、tic,adCmdText;while(!m_pRecordset->adoEOFvID=m_pRecordset->GetCollect(_variant_t(long0;/取得第1列的值,從0開始計(jì)數(shù), /你也可以直接給出列的名稱,如下一行vUsername=m_pRecordset->GetCollect("username"/取得username字段的值vOld=m_pRecordset->GetCollect("old"vBirthday=m_pRecordset->GetCollect("birthda

25、y"/在DEBUG方式下的OUTPUT窗口輸出記錄集中的記錄if(vID.vt!=VT_NULL&&vUsername.vt!=VT_NULL&&vOld.vt!=VT_NULL&& vBirthday.vt!=VT_NULLTRACE("id:%d,姓名:%s,年齡:%d,生日:%srn",vID.lVal,(LPCTSTR(_bstr_tvUsername,vOld.lVal,(LPCTSTR(_bstr_tvBirthday;m_pRecordset->MoveNext(;/移到下一條記錄m_pRecor

26、dset->MoveFirst(;/移到首條記錄m_pRecordset->Delete(adAffectCurrent;/刪除當(dāng)前記錄/添加三條新記錄并賦值for(int i=0;i<3;i+m_pRecordset->AddNew(;/添加新記錄m_pRecordset->PutCollect("ID",_variant_t(long(i+10;m_pRecordset->PutCollect("username",_variant_t("葉利欽"m_pRecordset->PutCollect("old",_variant_t(long71;m_pRecordset->PutCollect("birthday",_variant_t("1930-3-15"m_pRecord

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論