ADO封裝類實(shí)現(xiàn)文件
一.引言
在過去幾年中,微軟公司相繼推出了幾種數(shù)據(jù)訪問技術(shù),先是DAO(Data Access Objects),然后是RDO(Remote Data Objects),現(xiàn)在是ADO(ActiceX Data Objects)。ADO是Microsoft數(shù)據(jù)庫應(yīng)用程序開發(fā)的新接口,是微軟***的數(shù)據(jù)訪問技術(shù)。它被設(shè)計(jì)用來同新的數(shù)據(jù)訪問層OLE DB Provider一起協(xié)同工作,以提供通用數(shù)據(jù)訪問(Universal Data Access)。ADO向我們提供了一個(gè)熟悉的,高層的對(duì)OLE DB的Automation封裝接口,它簡化了數(shù)據(jù)訪問的過程,增加了數(shù)據(jù)訪問的靈活性,是當(dāng)前數(shù)據(jù)訪問接口的主流技術(shù)。
用VB或者VBScript來操作ADO是非常方便的,但是如果使用C++或者是Java,就必須要處理類似Variants這樣的數(shù)據(jù)結(jié)構(gòu),從而實(shí)現(xiàn)和C++數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換,而這種處理無疑是C++開發(fā)人員都很頭疼的事情。而且ADO是應(yīng)用層的編程接口,它通過OLE DB提供的COM接口訪問數(shù)據(jù),使用ADO訪問數(shù)據(jù)庫需要使用許多API函數(shù)和ADO的對(duì)象,對(duì)于初學(xué)者來說,可能有些難度。即便對(duì)于ADO的編程高手,經(jīng)常要書寫大量相同的ADO冗余代碼,也會(huì)感到厭煩??催^網(wǎng)上不少紹封裝ADO的各種文章,也各有利弊。筆者在Visual C++下也嘗試封裝ADO訪問數(shù)據(jù)庫類,使其更方便地使用現(xiàn)有的VC的數(shù)據(jù)類型,簡化應(yīng)用程序書寫的邏輯,增加程序的可讀性。達(dá)到了比較好的應(yīng)用效果,本文將給出筆者所使用封裝方法和源程序。
二.建立ADO封裝類
1.ADO對(duì)象基本模型
ADO模型包含了連接對(duì)象、命令對(duì)象、域?qū)ο?、參?shù)對(duì)象、記錄集對(duì)象、錯(cuò)誤對(duì)象等。對(duì)象之間又具有層次關(guān)系,其關(guān)系如圖1所示。
在VC中使用ADO訪問數(shù)據(jù)庫基本過程是:
◆初始化COM庫,引入ADO庫文件
◆用Connection對(duì)象連接數(shù)據(jù)庫
◆利用建立好的連接,通過利用Recordset對(duì)象取得結(jié)果記錄集進(jìn)行查詢、處理。
◆使用完畢后關(guān)閉連接釋放對(duì)象
2.基本操作函數(shù)和數(shù)據(jù)結(jié)構(gòu)
封裝的ADO類應(yīng)包括以下函數(shù)和數(shù)據(jù)結(jié)構(gòu):
1)建立數(shù)據(jù)庫連接函數(shù)OpenDataBase()
ADO連接數(shù)據(jù)庫首先要用到Connection對(duì)象,它是到數(shù)據(jù)庫的物理連接,管理著應(yīng)用程序和數(shù)據(jù)庫之間的通訊。對(duì)于大多數(shù)的數(shù)據(jù)庫系統(tǒng),每一個(gè)物理連接都需要耗費(fèi)大量系統(tǒng)內(nèi)存,是寶貴的系統(tǒng)資源,不可濫用。考慮到應(yīng)用程序的效率,每一個(gè)數(shù)據(jù)庫客戶端都只用一個(gè)物理連接,并且應(yīng)用程序結(jié)束后應(yīng)該釋放。
2)關(guān)閉數(shù)據(jù)庫連接函數(shù)CloseDataBase()
3)SQL查詢語句函數(shù) Select()
記錄集的建立和查詢結(jié)果得獲取是影響應(yīng)用程序得效率得關(guān)鍵問題。由于每一次查詢結(jié)果都可能不一樣,所以每個(gè)查詢語句都要建立一個(gè)記錄集對(duì)象。
4)執(zhí)行無返回結(jié)果的SQL語句函數(shù)Excute()
5)查詢結(jié)果數(shù)組pData
為了數(shù)據(jù)類型轉(zhuǎn)換的方便,我們將記錄集數(shù)據(jù)類型都轉(zhuǎn)換為CString類型,存放在查詢結(jié)果數(shù)組pData中,由于C++的CString是一個(gè)高效和功能強(qiáng)大的類,我們可以很方便地讀取記錄集中的查詢結(jié)果。
6)結(jié)果數(shù)組大小nResultRow和nResultCol
3.ADO封裝類實(shí)現(xiàn)文件
封裝類頭文件ADODB.H定義如下:
- class CADODB : public CObject
- {
- public:
- CADODB(); //構(gòu)造函數(shù)
- ~CADODB(); //析構(gòu)函數(shù)
- public:
- int nResultRow; //查詢結(jié)果行數(shù)
- int nResultCol; //查詢結(jié)果列數(shù)
- CStringArray pData; //存放查詢結(jié)果數(shù)組 大小為nRow*nCol
- CString errormessage; //ADO錯(cuò)誤信息
- bool OpenDataBase(CString DsnName,CString sUserID,CString sPassword);
- //打開數(shù)據(jù)庫連接 輸入DSN名稱、用戶ID和密碼
- int Select(CString Sql); //執(zhí)行SQL查詢語句,結(jié)果放在數(shù)組pData中
- int Excute(CString Sql); //執(zhí)行無返回值得SQL語句
- bool CloseDataBase(); //關(guān)閉數(shù)據(jù)庫連接
- protected:
- _ConnectionPtr m_pConnection; //定義連接指針
- };
4.ADO封裝類實(shí)現(xiàn)文件
ADO封裝類實(shí)現(xiàn)文件ADODB.CPP如下:
- #include "stdafx.h"
- #include "ADODB.h"
- CADODB::CADODB() //構(gòu)造函數(shù),完成初始化
- {
- nResultRow=0; //
三.使用ADO封裝類
建立了ADO封裝類后,使用數(shù)據(jù)庫操作就非常簡單了。在需使用數(shù)據(jù)庫查詢的CPP文件中包含ADO封裝類頭文件"ADODB.H",然后定義一個(gè)CADODB類指針;接下來就是打開數(shù)據(jù)庫連接。使用封裝類的成員函數(shù)OpenDataBase(…),輸入要連接的數(shù)據(jù)庫的DSN名稱、用戶名和密碼,就與數(shù)據(jù)庫建立連接了。要注意的是如果同時(shí)連接多個(gè)數(shù)據(jù)庫就要聲明多個(gè)CADODB對(duì)象指針,保證數(shù)據(jù)庫連接對(duì)象是全局且惟一。接下來就是,調(diào)用成員函數(shù)Select取得數(shù)據(jù)庫查詢結(jié)果,執(zhí)行完畢后查詢結(jié)果放在CADODB的成員字符數(shù)組指針pData中,數(shù)組大小可以從成員變量nResultRow和nResultCol中得出?;静襟E如下:
在"stdafx.h"中加入ADO庫的導(dǎo)入語句
- #import "c:program filescommon filessystemadomsado15.dll"
no_namespace rename("EOF","adoEOF")
在應(yīng)用程序類中初始化COM對(duì)象,在InitInstance()中加入以下語句
- AfxOleInit();
加入ADO封裝類實(shí)現(xiàn)文件
- #include "ADODB.H"
- …
定義ADO封裝類實(shí)現(xiàn)文件
- CADODB ADO1; //連接數(shù)據(jù)庫
- CADODB ADO2; //連接數(shù)據(jù)庫
- …
- ADO1.OpenDataBase("數(shù)據(jù)源名稱","用戶ID","用戶密碼")
- //建立連接,***次連接時(shí)調(diào)用
- ADO1.Select("select * from 表名");
- //執(zhí)行SQL查詢語句
- int nRow= ADO1.GetResultRow();
- //取得記錄行數(shù)
- int nCol= ADO1.GetResultCol();
- //取得記錄列數(shù)
- for(i=0;ifor(j=0;jprintf("第%d行第%d列的值是%s",i,j,ADO1.pData[i*nCol+j];
- …
- ADO1.CloseDataBase();
- //使用完后關(guān)閉數(shù)據(jù)庫連接
四.結(jié)論和建議
使用ADO封裝類后,在應(yīng)用程序中操作數(shù)據(jù)庫的過程就變得簡單了,針對(duì)一般的數(shù)據(jù)庫應(yīng)用程序,而且在數(shù)據(jù)量不很大的情況下,本封裝類已經(jīng)能夠應(yīng)付,在使用效率上也比較滿意。但是該封裝沒有考慮數(shù)據(jù)訪問的優(yōu)化處理,數(shù)據(jù)庫使用了動(dòng)態(tài)連接方式,記錄集也沒有進(jìn)行分頁處理,ADO緩沖區(qū)大小和游標(biāo)類型都采用缺省設(shè)置,這些在實(shí)際使用中都可能降低封裝類的性能,讀者可以根據(jù)不同的應(yīng)用情況有針對(duì)地進(jìn)行修改。
【編輯推薦】