日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
ADO封裝類(lèi)實(shí)現(xiàn)文件

堅(jiān)守“ 做人真誠(chéng) · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價(jià)值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都成都門(mén)窗定制小微創(chuàng)業(yè)公司專業(yè)提供成都企業(yè)網(wǎng)站定制營(yíng)銷(xiāo)網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺(jué)設(shè)計(jì)、底層架構(gòu)、網(wǎng)頁(yè)布局、功能開(kāi)發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。

一.引言

在過(guò)去幾年中,微軟公司相繼推出了幾種數(shù)據(jù)訪問(wèn)技術(shù),先是DAO(Data Access Objects),然后是RDO(Remote Data Objects),現(xiàn)在是ADO(ActiceX Data Objects)。ADO是Microsoft數(shù)據(jù)庫(kù)應(yīng)用程序開(kāi)發(fā)的新接口,是微軟***的數(shù)據(jù)訪問(wèn)技術(shù)。它被設(shè)計(jì)用來(lái)同新的數(shù)據(jù)訪問(wèn)層OLE DB Provider一起協(xié)同工作,以提供通用數(shù)據(jù)訪問(wèn)(Universal Data Access)。ADO向我們提供了一個(gè)熟悉的,高層的對(duì)OLE DB的Automation封裝接口,它簡(jiǎn)化了數(shù)據(jù)訪問(wèn)的過(guò)程,增加了數(shù)據(jù)訪問(wèn)的靈活性,是當(dāng)前數(shù)據(jù)訪問(wèn)接口的主流技術(shù)。

用VB或者VBScript來(lái)操作ADO是非常方便的,但是如果使用C++或者是Java,就必須要處理類(lèi)似Variants這樣的數(shù)據(jù)結(jié)構(gòu),從而實(shí)現(xiàn)和C++數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換,而這種處理無(wú)疑是C++開(kāi)發(fā)人員都很頭疼的事情。而且ADO是應(yīng)用層的編程接口,它通過(guò)OLE DB提供的COM接口訪問(wèn)數(shù)據(jù),使用ADO訪問(wèn)數(shù)據(jù)庫(kù)需要使用許多API函數(shù)和ADO的對(duì)象,對(duì)于初學(xué)者來(lái)說(shuō),可能有些難度。即便對(duì)于ADO的編程高手,經(jīng)常要書(shū)寫(xiě)大量相同的ADO冗余代碼,也會(huì)感到厭煩。看過(guò)網(wǎng)上不少紹封裝ADO的各種文章,也各有利弊。筆者在Visual C++下也嘗試封裝ADO訪問(wèn)數(shù)據(jù)庫(kù)類(lèi),使其更方便地使用現(xiàn)有的VC的數(shù)據(jù)類(lèi)型,簡(jiǎn)化應(yīng)用程序書(shū)寫(xiě)的邏輯,增加程序的可讀性。達(dá)到了比較好的應(yīng)用效果,本文將給出筆者所使用封裝方法和源程序。

二.建立ADO封裝類(lèi)

1.ADO對(duì)象基本模型

ADO模型包含了連接對(duì)象、命令對(duì)象、域?qū)ο?、參?shù)對(duì)象、記錄集對(duì)象、錯(cuò)誤對(duì)象等。對(duì)象之間又具有層次關(guān)系,其關(guān)系如圖1所示。

在VC中使用ADO訪問(wèn)數(shù)據(jù)庫(kù)基本過(guò)程是:
◆初始化COM庫(kù),引入ADO庫(kù)文件
◆用Connection對(duì)象連接數(shù)據(jù)庫(kù)
◆利用建立好的連接,通過(guò)利用Recordset對(duì)象取得結(jié)果記錄集進(jìn)行查詢、處理。
◆使用完畢后關(guān)閉連接釋放對(duì)象

2.基本操作函數(shù)和數(shù)據(jù)結(jié)構(gòu)

封裝的ADO類(lèi)應(yīng)包括以下函數(shù)和數(shù)據(jù)結(jié)構(gòu):

1)建立數(shù)據(jù)庫(kù)連接函數(shù)OpenDataBase()

ADO連接數(shù)據(jù)庫(kù)首先要用到Connection對(duì)象,它是到數(shù)據(jù)庫(kù)的物理連接,管理著應(yīng)用程序和數(shù)據(jù)庫(kù)之間的通訊。對(duì)于大多數(shù)的數(shù)據(jù)庫(kù)系統(tǒng),每一個(gè)物理連接都需要耗費(fèi)大量系統(tǒng)內(nèi)存,是寶貴的系統(tǒng)資源,不可濫用??紤]到應(yīng)用程序的效率,每一個(gè)數(shù)據(jù)庫(kù)客戶端都只用一個(gè)物理連接,并且應(yīng)用程序結(jié)束后應(yīng)該釋放。

2)關(guān)閉數(shù)據(jù)庫(kù)連接函數(shù)CloseDataBase()

3)SQL查詢語(yǔ)句函數(shù) Select()

記錄集的建立和查詢結(jié)果得獲取是影響應(yīng)用程序得效率得關(guān)鍵問(wèn)題。由于每一次查詢結(jié)果都可能不一樣,所以每個(gè)查詢語(yǔ)句都要建立一個(gè)記錄集對(duì)象。

4)執(zhí)行無(wú)返回結(jié)果的SQL語(yǔ)句函數(shù)Excute()

5)查詢結(jié)果數(shù)組pData

為了數(shù)據(jù)類(lèi)型轉(zhuǎn)換的方便,我們將記錄集數(shù)據(jù)類(lèi)型都轉(zhuǎn)換為CString類(lèi)型,存放在查詢結(jié)果數(shù)組pData中,由于C++的CString是一個(gè)高效和功能強(qiáng)大的類(lèi),我們可以很方便地讀取記錄集中的查詢結(jié)果。

6)結(jié)果數(shù)組大小nResultRow和nResultCol

3.ADO封裝類(lèi)實(shí)現(xiàn)文件

封裝類(lèi)頭文件ADODB.H定義如下:

  
  
  
  
  1. class CADODB : public CObject  
  2. {  
  3. public:  
  4. CADODB(); //構(gòu)造函數(shù)  
  5. ~CADODB(); //析構(gòu)函數(shù)  
  6. public:  
  7. int nResultRow; //查詢結(jié)果行數(shù)  
  8. int nResultCol; //查詢結(jié)果列數(shù)   
  9. CStringArray pData; //存放查詢結(jié)果數(shù)組 大小為nRow*nCol   
  10. CString errormessage; //ADO錯(cuò)誤信息  
  11. bool OpenDataBase(CString DsnName,CString sUserID,CString sPassword);  
  12. //打開(kāi)數(shù)據(jù)庫(kù)連接 輸入DSN名稱、用戶ID和密碼  
  13. int Select(CString Sql); //執(zhí)行SQL查詢語(yǔ)句,結(jié)果放在數(shù)組pData中  
  14. int Excute(CString Sql); //執(zhí)行無(wú)返回值得SQL語(yǔ)句  
  15. bool CloseDataBase(); //關(guān)閉數(shù)據(jù)庫(kù)連接  
  16. protected:  
  17. _ConnectionPtr m_pConnection; //定義連接指針  
  18. }; 

4.ADO封裝類(lèi)實(shí)現(xiàn)文件

ADO封裝類(lèi)實(shí)現(xiàn)文件ADODB.CPP如下:

  
  
  
  
  1. #include "stdafx.h"     
  2. #include "ADODB.h"     
  3.  
  4. CADODB::CADODB() //構(gòu)造函數(shù),完成初始化     
  5. {     
  6. nResultRow=0; //     
  7. nResultCol=0; //記錄集行數(shù)和列數(shù)     
  8. m_pConnection = NULL;     
  9. }     
  10.  
  11. CADODB::~CADODB() //關(guān)閉數(shù)據(jù)庫(kù)物理連接     
  12. {     
  13. if(m_pConnection )m_pConnection->Close();      
  14. m_pConnection = NULL;     
  15. }     
  16.  
  17. bool CADODB::OpenDataBase(CString DsnName,CString sUserID,CString sPassword)     
  18. { //打開(kāi)數(shù)據(jù)庫(kù)連接     
  19. …     
  20. HRESULT hr=m_pConnection.CreateInstance("ADODB.Connection");//創(chuàng)建連接對(duì)象     
  21. hr=m_pConnection->Open((_bstr_t)DsnName,(_bstr_t)sUserID,  
  22. (_bstr_t)sPassword,adOpenUnspecified); //連接數(shù)據(jù)庫(kù)     
  23. …     
  24. }     
  25.  
  26. int CADODB::Select(CString SqlStr) //SQL查詢語(yǔ)句函數(shù)     
  27. { …     
  28. try     
  29. {     
  30. hr = m_pRecordset.CreateInstance("ADODB.Recordset");//創(chuàng)建紀(jì)錄集對(duì)象實(shí)例     
  31. hr = m_pRecordset->putref_ActiveConnection(m_pConnection);//設(shè)置連接對(duì)象     
  32. hr=m_pRecordset->Open  
  33. (vSqlString,vNull,adOpenDynamic,adLockOptimistic,adCmdText); //打開(kāi)紀(jì)錄集     
  34. nResultCol = m_pRecordset->Fields->GetCount();//獲得紀(jì)錄集總列數(shù)     
  35. while(!m_pRecordset->adoEOF)     
  36. {     
  37. for (j = 0; j < nResultCol; j++) //取一列數(shù)據(jù)     
  38. {     
  39. vValue = m_pRecordset->Fields->Item[(long)j]->Value;//取得當(dāng)前記錄字段數(shù)據(jù)     
  40. if(vValue.vt != 1) //數(shù)據(jù)非空     
  41. {     
  42. int type = vValue.vt;     
  43. if(VariantChangeType(&vValue1, &vValue, 0, VT_BSTR) == S_OK)    
  44. //轉(zhuǎn)換數(shù)據(jù)類(lèi)型(為字符串)     
  45. str=vValue1.bstrVal; //保存結(jié)果值到臨時(shí)變量str中     
  46. }     
  47. if(pData.GetSize()m_pResult.SetSize(i*nResultCol+j+1);     
  48. pData[i*nResultCol+j]=str; //保存結(jié)果到數(shù)組中     
  49. m_pRecordset->MoveNext(); //移動(dòng)記錄集指針到下一行     
  50. i++;     
  51. }     
  52. m_pRecordset->Close();     
  53. m_pRecordset=NULL;     
  54. nResultRow=i;     
  55. }     
  56. catch(_com_error e)///捕捉異常     
  57. {     
  58. …      
  59. }     
  60. pData->FreeExtra();//釋放多余的內(nèi)存空間     
  61. return nResultRow;     
  62. }     
  63. …   

三.使用ADO封裝類(lèi)

建立了ADO封裝類(lèi)后,使用數(shù)據(jù)庫(kù)操作就非常簡(jiǎn)單了。在需使用數(shù)據(jù)庫(kù)查詢的CPP文件中包含ADO封裝類(lèi)頭文件"ADODB.H",然后定義一個(gè)CADODB類(lèi)指針;接下來(lái)就是打開(kāi)數(shù)據(jù)庫(kù)連接。使用封裝類(lèi)的成員函數(shù)OpenDataBase(…),輸入要連接的數(shù)據(jù)庫(kù)的DSN名稱、用戶名和密碼,就與數(shù)據(jù)庫(kù)建立連接了。要注意的是如果同時(shí)連接多個(gè)數(shù)據(jù)庫(kù)就要聲明多個(gè)CADODB對(duì)象指針,保證數(shù)據(jù)庫(kù)連接對(duì)象是全局且惟一。接下來(lái)就是,調(diào)用成員函數(shù)Select取得數(shù)據(jù)庫(kù)查詢結(jié)果,執(zhí)行完畢后查詢結(jié)果放在CADODB的成員字符數(shù)組指針pData中,數(shù)組大小可以從成員變量nResultRow和nResultCol中得出?;静襟E如下:

在"stdafx.h"中加入ADO庫(kù)的導(dǎo)入語(yǔ)句

  
  
  
  
  1. #import "c:program filescommon filessystemadomsado15.dll" 
    no_namespace rename("EOF","adoEOF")  

在應(yīng)用程序類(lèi)中初始化COM對(duì)象,在InitInstance()中加入以下語(yǔ)句

  
  
  
  
  1. AfxOleInit();   

加入ADO封裝類(lèi)實(shí)現(xiàn)文件

  
  
  
  
  1. #include "ADODB.H"  
  2. …  

定義ADO封裝類(lèi)實(shí)現(xiàn)文件

  
  
  
  
  1. CADODB ADO1;   //連接數(shù)據(jù)庫(kù)  
  2. CADODB ADO2;  //連接數(shù)據(jù)庫(kù)  
  3. …  
  4. ADO1.OpenDataBase("數(shù)據(jù)源名稱","用戶ID","用戶密碼")  
  5. //建立連接,***次連接時(shí)調(diào)用  
  6. ADO1.Select("select * from 表名");  
  7. //執(zhí)行SQL查詢語(yǔ)句  
  8. int nRowADO1.GetResultRow();  
  9. //取得記錄行數(shù)  
  10. int nColADO1.GetResultCol();  
  11. //取得記錄列數(shù)  
  12. for(i=0;ifor(j=0;jprintf("第%d行第%d列的值是%s",i,j,ADO1.pData[i*nCol+j];  
  13.  …  
  14. ADO1.CloseDataBase();  
  15. //使用完后關(guān)閉數(shù)據(jù)庫(kù)連接   

四.結(jié)論和建議

使用ADO封裝類(lèi)后,在應(yīng)用程序中操作數(shù)據(jù)庫(kù)的過(guò)程就變得簡(jiǎn)單了,針對(duì)一般的數(shù)據(jù)庫(kù)應(yīng)用程序,而且在數(shù)據(jù)量不很大的情況下,本封裝類(lèi)已經(jīng)能夠應(yīng)付,在使用效率上也比較滿意。但是該封裝沒(méi)有考慮數(shù)據(jù)訪問(wèn)的優(yōu)化處理,數(shù)據(jù)庫(kù)使用了動(dòng)態(tài)連接方式,記錄集也沒(méi)有進(jìn)行分頁(yè)處理,ADO緩沖區(qū)大小和游標(biāo)類(lèi)型都采用缺省設(shè)置,這些在實(shí)際使用中都可能降低封裝類(lèi)的性能,讀者可以根據(jù)不同的應(yīng)用情況有針對(duì)地進(jìn)行修改。


標(biāo)題名稱:ADO封裝類(lèi)實(shí)現(xiàn)文件
轉(zhuǎn)載注明:http://m.5511xx.com/article/dpoepgc.html