成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ADO封裝類實現(xiàn)文件

開發(fā) 開發(fā)工具
這里介紹ADO封裝類,微軟公司相繼推出了幾種數(shù)據(jù)訪問技術,先是DAO(Data Access Objects),然后是RDO(Remote Data Objects),現(xiàn)在是ADO(ActiceX Data Objects)。

一.引言

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

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

二.建立ADO封裝類

1.ADO對象基本模型

ADO模型包含了連接對象、命令對象、域對象、參數(shù)對象、記錄集對象、錯誤對象等。對象之間又具有層次關系,其關系如圖1所示。

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

2.基本操作函數(shù)和數(shù)據(jù)結構

封裝的ADO類應包括以下函數(shù)和數(shù)據(jù)結構:

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

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

2)關閉數(shù)據(jù)庫連接函數(shù)CloseDataBase()

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

記錄集的建立和查詢結果得獲取是影響應用程序得效率得關鍵問題。由于每一次查詢結果都可能不一樣,所以每個查詢語句都要建立一個記錄集對象。

4)執(zhí)行無返回結果的SQL語句函數(shù)Excute()

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

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

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

3.ADO封裝類實現(xiàn)文件

封裝類頭文件ADODB.H定義如下:

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

4.ADO封裝類實現(xiàn)文件

ADO封裝類實現(xiàn)文件ADODB.CPP如下:

  1. #include "stdafx.h"     
  2. #include "ADODB.h"     
  3.  
  4. CADODB::CADODB() //構造函數(shù),完成初始化     
  5. {     
  6. nResultRow=0; //     
  7. nResultCol=0; //記錄集行數(shù)和列數(shù)     
  8. m_pConnection = NULL;     
  9. }     
  10.  
  11. CADODB::~CADODB() //關閉數(shù)據(jù)庫物理連接     
  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. { //打開數(shù)據(jù)庫連接     
  19. …     
  20. HRESULT hr=m_pConnection.CreateInstance("ADODB.Connection");//創(chuàng)建連接對象     
  21. hr=m_pConnection->Open((_bstr_t)DsnName,(_bstr_t)sUserID,  
  22. (_bstr_t)sPassword,adOpenUnspecified); //連接數(shù)據(jù)庫     
  23. …     
  24. }     
  25.  
  26. int CADODB::Select(CString SqlStr) //SQL查詢語句函數(shù)     
  27. { …     
  28. try     
  29. {     
  30. hr = m_pRecordset.CreateInstance("ADODB.Recordset");//創(chuàng)建紀錄集對象實例     
  31. hr = m_pRecordset->putref_ActiveConnection(m_pConnection);//設置連接對象     
  32. hr=m_pRecordset->Open  
  33. (vSqlString,vNull,adOpenDynamic,adLockOptimistic,adCmdText); //打開紀錄集     
  34. nResultCol = m_pRecordset->Fields->GetCount();//獲得紀錄集總列數(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;//取得當前記錄字段數(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. //轉換數(shù)據(jù)類型(為字符串)     
  45. str=vValue1.bstrVal; //保存結果值到臨時變量str中     
  46. }     
  47. if(pData.GetSize()m_pResult.SetSize(i*nResultCol+j+1);     
  48. pData[i*nResultCol+j]=str; //保存結果到數(shù)組中     
  49. m_pRecordset->MoveNext(); //移動記錄集指針到下一行     
  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封裝類

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

在"stdafx.h"中加入ADO庫的導入語句

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

在應用程序類中初始化COM對象,在InitInstance()中加入以下語句

  1. AfxOleInit();   

加入ADO封裝類實現(xiàn)文件

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

定義ADO封裝類實現(xiàn)文件

  1. CADODB ADO1;   //連接數(shù)據(jù)庫  
  2. CADODB ADO2;  //連接數(shù)據(jù)庫  
  3. …  
  4. ADO1.OpenDataBase("數(shù)據(jù)源名稱","用戶ID","用戶密碼")  
  5. //建立連接,***次連接時調(diào)用  
  6. ADO1.Select("select * from 表名");  
  7. //執(zhí)行SQL查詢語句  
  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. //使用完后關閉數(shù)據(jù)庫連接   

四.結論和建議

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

【編輯推薦】

  1. C#構造函數(shù)與C++的區(qū)別淺析
  2. 實例淺析Visual Studio 2010的C++0x特性
  3. C++標準委員會確定將concepts特性從C++0x中移除
  4. C#調(diào)用C++動態(tài)鏈接庫方法介紹
  5. 關于C++和C#類型比較的相關表格
責任編輯:彭凡 來源: CSDN
相關推薦

2009-12-25 15:28:48

ADO類

2009-12-22 10:58:50

ADO.NET類

2009-12-21 14:14:08

ADO.NET類文件

2009-12-21 14:31:29

ADO.NET類文件

2010-10-12 11:31:07

連接MYSQL

2009-12-25 16:31:38

ADO類

2009-11-12 10:15:37

ADO.NET使用

2009-11-04 10:07:52

ADO.NET DbP

2009-12-30 16:45:31

ADO操作

2009-12-29 10:56:06

ADO支持文件

2010-01-04 11:14:40

ADO類庫

2009-11-11 15:50:59

ADO內(nèi)存數(shù)據(jù)對象

2009-12-18 16:39:59

ADO.NET基礎類

2009-12-24 15:42:01

ADO類庫

2009-12-29 16:07:19

ADO類型

2009-11-04 08:38:30

ADO.NET庫文件

2012-03-09 10:58:23

2009-12-18 15:11:50

ADO.NET類

2009-12-31 14:18:46

ADO.NET類庫

2009-12-28 16:57:40

ADO .NET 類
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级毛片免费看 | 日韩免费av一区二区 | 先锋资源在线 | 日本福利片 | 日日做夜夜爽毛片麻豆 | 一区福利视频 | 天天操人人干 | 亚洲精品久久久久久一区二区 | 亚洲成人av在线播放 | 99re热精品视频 | www.玖玖玖 | 亚洲黄色一区二区三区 | 日本在线免费 | 亚洲激情视频在线 | 欧美日韩在线播放 | 亚洲精品久久久久久久不卡四虎 | 亚洲一区 | 黄a免费看 | 国产中文区二幕区2012 | 美女网站视频免费黄 | 天天综合网天天综合色 | 国产中文在线 | 天天插天天操 | 亚洲三级在线 | 国产美女在线免费观看 | 精品久久一区 | 午夜视频一区二区 | 国产亚洲一区二区三区在线观看 | 欧美成人h版在线观看 | 国产羞羞视频在线观看 | 亚洲精品久久久一区二区三区 | 欧美日韩高清 | 狠狠操狠狠色 | 亚洲免费视频一区二区 | 一区二区三区欧美 | 一区二区成人 | 一区二区三区免费观看 | 国产精品久久久久久久久免费樱桃 | 欧美精品一区二区免费 | 少妇精品久久久久久久久久 | 精品免费国产一区二区三区四区介绍 |