www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 工業(yè)控制 > 電子設(shè)計(jì)自動(dòng)化
[導(dǎo)讀]摘 要:本文介紹了ADO訪問(wèn)數(shù)據(jù)庫(kù)的基本過(guò)程,給出了一種在Visual C++下封裝ADO訪問(wèn)數(shù)據(jù)庫(kù)類的方法。關(guān)鍵詞:封裝;ADO;Visual C1 引言在過(guò)去幾年中,微軟公司相繼推出了幾種數(shù)據(jù)訪問(wèn)技術(shù),先是DAO(Data Access Objec

摘 要:本文介紹了ADO訪問(wèn)數(shù)據(jù)庫(kù)的基本過(guò)程,給出了一種在Visual C++下封裝ADO訪問(wèn)數(shù)據(jù)庫(kù)類的方法。

關(guān)鍵詞:封裝;ADO;Visual C

1 引言

在過(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,就必須要處理類似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ù)類,使其更方便地使用現(xiàn)有的VC的數(shù)據(jù)類型,簡(jiǎn)化應(yīng)用程序書(shū)寫(xiě)的邏輯,增加程序的可讀性。達(dá)到了比較好的應(yīng)用效果,本文將給出筆者所使用封裝方法和源程序。

2 建立ADO封裝類

2.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.2基本操作函數(shù)和數(shù)據(jù)結(jié)構(gòu)

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

6)結(jié)果數(shù)組大小nResultRow和nResultCol
2.3 ADO封裝類頭文件

封裝類頭文件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);
//打開(kāi)數(shù)據(jù)庫(kù)連接 輸入DSN名稱、用戶ID和密碼
int Select(CString Sql); //執(zhí)行SQL查詢語(yǔ)句,結(jié)果放在數(shù)組pData中
int Excute(CString Sql); //執(zhí)行無(wú)返回值得SQL語(yǔ)句
bool CloseDataBase(); //關(guān)閉數(shù)據(jù)庫(kù)連接
protected:
_ConnectionPtr m_pConnection; //定義連接指針
};

2.4 封裝類實(shí)現(xiàn)文件

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

#include "stdafx.h"
#include "ADODB.h"

CADODB::CADODB() //構(gòu)造函數(shù),完成初始化
{
nResultRow=0; //
nResultCol=0; //記錄集行數(shù)和列數(shù)
m_pConnection = NULL;
}

CADODB::~CADODB() //關(guān)閉數(shù)據(jù)庫(kù)物理連接
{
if(m_pConnection )m_pConnection->Close();
m_pConnection = NULL;
}

bool CADODB::OpenDataBase(CString DsnName,CString sUserID,CString sPassword)
{ //打開(kāi)數(shù)據(jù)庫(kù)連接

HRESULT hr=m_pConnection.CreateInstance("ADODB.Connection");//創(chuàng)建連接對(duì)象
hr=m_pConnection->Open((_bstr_t)DsnName,(_bstr_t)sUserID,(_bstr_t)sPassword,adOpenUnspecified); //連接數(shù)據(jù)庫(kù)

}

int CADODB::Select(CString SqlStr) //SQL查詢語(yǔ)句函數(shù)
{ …
try
{
hr = m_pRecordset.CreateInstance("ADODB.Recordset");//創(chuàng)建紀(jì)錄集對(duì)象實(shí)例
hr = m_pRecordset->putref_ActiveConnection(m_pConnection);//設(shè)置連接對(duì)象
hr=m_pRecordset->Open(vSqlString,vNull,adOpenDynamic,adLockOptimistic,adCmdText); //打開(kāi)紀(jì)錄集
nResultCol = m_pRecordset->Fields->GetCount();//獲得紀(jì)錄集總列數(shù)
while(!m_pRecordset->adoEOF)
{
for (j = 0; j < nResultCol; j++) //取一列數(shù)據(jù)
{
vValue = m_pRecordset->Fields->Item[(long)j]->Value;//取得當(dāng)前記錄字段數(shù)據(jù)
if(vValue.vt != 1) //數(shù)據(jù)非空
{
int type = vValue.vt;
if(VariantChangeType(&vValue1, &vValue, 0, VT_BSTR) == S_OK) //轉(zhuǎn)換數(shù)據(jù)類型(為字符串)
str=vValue1.bstrVal; //保存結(jié)果值到臨時(shí)變量str中
}
if(pData.GetSize()<i*nResultCol+j+1) //動(dòng)態(tài)設(shè)置數(shù)組的大小
m_pResult.SetSize(i*nResultCol+j+1);
pData[i*nResultCol+j]=str; //保存結(jié)果到數(shù)組中
m_pRecordset->MoveNext(); //移動(dòng)記錄集指針到下一行
i++;
}
m_pRecordset->Close();
m_pRecordset=NULL;
nResultRow=i;
}
catch(_com_error e)///捕捉異常
{


}
pData->FreeExtra();//釋放多余的內(nèi)存空間
return nResultRow;
}
… 3 使用ADO封裝類

建立了ADO封裝類后,使用數(shù)據(jù)庫(kù)操作就非常簡(jiǎn)單了。在需使用數(shù)據(jù)庫(kù)查詢的CPP文件中包含ADO封裝類頭文件"ADODB.H",然后定義一個(gè)CADODB類指針;接下來(lái)就是打開(kāi)數(shù)據(jù)庫(kù)連接。使用封裝類的成員函數(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ǔ)句

#import "c:program filescommon filessystemadomsado15.dll" no_namespace rename("EOF","adoEOF")
在應(yīng)用程序類中初始化COM對(duì)象,在InitInstance()中加入以下語(yǔ)句

AfxOleInit();
加入封裝類的聲明文件

#include "ADODB.H"

定義封裝類對(duì)象

CADODB ADO1; //連接數(shù)據(jù)庫(kù)1
CADODB ADO2; //連接數(shù)據(jù)庫(kù)2

ADO1.OpenDataBase("數(shù)據(jù)源名稱","用戶ID","用戶密碼") //建立連接,第一次連接時(shí)調(diào)用
ADO1.Select("select * from 表名"); //執(zhí)行SQL查詢語(yǔ)句
int nRow= ADO1.GetResultRow(); //取得記錄行數(shù)
int nCol= ADO1.GetResultCol(); //取得記錄列數(shù)
for(i=0;i<nRow;i++) //取得查詢結(jié)果
for(j=0;j<nCol;j++)
printf("第%d行第%d列的值是%s",i,j,ADO1.pData[i*nCol+j];

ADO1.CloseDataBase(); //使用完后關(guān)閉數(shù)據(jù)庫(kù)連接
4 結(jié)論和建議

使用封裝ADO類后,在應(yīng)用程序中操作數(shù)據(jù)庫(kù)的過(guò)程就變得簡(jiǎn)單了,針對(duì)一般的數(shù)據(jù)庫(kù)應(yīng)用程序,而且在數(shù)據(jù)量不很大的情況下,本封裝類已經(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)類型都采用缺省設(shè)置,這些在實(shí)際使用中都可能降低封裝類的性能,讀者可以根據(jù)不同的應(yīng)用情況有針對(duì)地進(jìn)行修改。


來(lái)源:0次

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉