0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用ado技術(shù)和mfc odbc技術(shù)的VC++圖像數(shù)據(jù)訪問(wèn)研究

電子設(shè)計(jì) ? 來(lái)源:電子產(chǎn)品世界 ? 作者:佚名 ? 2020-02-25 08:07 ? 次閱讀

1 、引言

在許多項(xiàng)目開(kāi)發(fā)中,由于存在著大量的數(shù)據(jù)需要存儲(chǔ),通常采用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)這些數(shù)據(jù),使得數(shù)據(jù)庫(kù)技術(shù)被越來(lái)越廣泛地應(yīng)用。在這些數(shù)據(jù)中有簡(jiǎn)單的文本文件,只需通過(guò)api的簡(jiǎn)單編程即可實(shí)現(xiàn),但也存在許多大對(duì)象數(shù)據(jù),比如圖像、音頻視頻等,其存儲(chǔ)形式有所不同。作為大對(duì)象數(shù)據(jù)的圖像數(shù)據(jù),一般以blob(二進(jìn)制大對(duì)象,binary large object)形式存儲(chǔ),例如access數(shù)據(jù)庫(kù)中ole對(duì)象數(shù)據(jù)類型、sql server數(shù)據(jù)庫(kù)中的image數(shù)據(jù)類型等。在vc++ 7.0的環(huán)境下,為了高效快捷的訪問(wèn)圖像數(shù)據(jù),需要采用合適的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)。

在vc++中標(biāo)準(zhǔn)的訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)有很多種,根據(jù)開(kāi)發(fā)的項(xiàng)目,采用了數(shù)據(jù)庫(kù)技術(shù)中最常見(jiàn)有效的兩種技術(shù)ado技術(shù)和mfc odbc在access數(shù)據(jù)庫(kù)中訪問(wèn)圖像數(shù)據(jù)。

2、 圖像數(shù)據(jù)訪問(wèn)原理

雖然圖像數(shù)據(jù)的格式有多種,例如bmp、jpg和gif等格式,但都可以看成是二進(jìn)制流,即blob類型。blob類型數(shù)據(jù)需要占用較大的硬盤(pán)空間和內(nèi)存,對(duì)存儲(chǔ)效率和查詢速度都有很大的影響。

圖像數(shù)據(jù)的訪問(wèn)分存儲(chǔ)和讀取兩個(gè)過(guò)程。在存儲(chǔ)過(guò)程中,由于存放圖像數(shù)據(jù)的字段是可變長(zhǎng)度(長(zhǎng)度一般為0~2g)的blob類型,無(wú)法直接存儲(chǔ),必須首先將存儲(chǔ)在文件中的圖像數(shù)據(jù)以二進(jìn)制流的形式讀到緩沖區(qū)中,然后再將緩沖區(qū)中的圖像數(shù)據(jù)添加到access數(shù)據(jù)庫(kù)中的ole對(duì)象中。在讀取過(guò)程中,將存放在access數(shù)據(jù)庫(kù)中的圖像數(shù)據(jù)讀到緩沖區(qū)中,然后在顯示在用戶界面上。圖像數(shù)據(jù)的訪問(wèn)原理如圖1所示。

使用ado技術(shù)和mfc odbc技術(shù)的VC++圖像數(shù)據(jù)訪問(wèn)研究

圖1 圖像數(shù)據(jù)訪問(wèn)原理圖

3、 應(yīng)用ado訪問(wèn)圖像數(shù)據(jù)

3.1 ado的介紹

ado(activex data objects)是microsoft數(shù)據(jù)庫(kù)應(yīng)用程序開(kāi)發(fā)的接口,是建立在ole db技術(shù)之上的高層數(shù)據(jù)庫(kù)訪技術(shù),簡(jiǎn)化了編程,且有利于程序的可移植性及可擴(kuò)充性。

ado包括connection對(duì)象、command對(duì)象、parameter對(duì)象、recordset對(duì)象、field對(duì)象、error對(duì)象、property對(duì)象以及相應(yīng)的集合對(duì)象,這些對(duì)象被封裝在_connection -ptr接口、_commndptr接口和_recordsetptr接口這三個(gè)基本接口中。

3.2 ado連接數(shù)據(jù)庫(kù)

(1) 導(dǎo)入ado庫(kù)

使用ado前需要在stdafx.h頭文件中導(dǎo)入該庫(kù),只需利用import指令將此動(dòng)態(tài)鏈接庫(kù)導(dǎo)入,具體代碼如下:

#import“c:program filescommon filessystemadomsado15.dll”o_namespaceename(“eof”,“adoeof”)

(2) 初始化com庫(kù)

ado本身是一個(gè)com組件,在使用時(shí)需要初始化com庫(kù),需要調(diào)用coinitialize函數(shù)來(lái)實(shí)現(xiàn)。

:: coinitialize(null);

(3) 創(chuàng)建connection對(duì)象并連接數(shù)據(jù)庫(kù)

創(chuàng)建connection對(duì)象:

_connectionptr m_pconnection;

m_pconnection.createinstanc -e(“adodb.connection”);

連接數(shù)據(jù)庫(kù):

_pconnection-》open(“provide -r=microsoft.jet.oledb.4.0;datasource = picture.mdb”, “”,“”, admodeunknown);

(4) 執(zhí)行操作

m_precordset.createinstance(“adodb.recordset”);

m_precordset-》open((_variant_t)strsql,_variant_t((idispatch*)theapp.m_pconnection,true),adopendynamic,adlockoptimistic,adcmdtext);

3.3 圖像數(shù)據(jù)的存儲(chǔ)

對(duì)于一般數(shù)據(jù),可以通過(guò)recordset對(duì)象的getcollect()和putcollect()函數(shù)來(lái)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)和讀取,而對(duì)于圖像數(shù)據(jù),就需要使用field對(duì)象中的appendchunk函數(shù)來(lái)進(jìn)行存儲(chǔ)和getchunk函數(shù)來(lái)進(jìn)行讀取。圖像數(shù)據(jù)的存儲(chǔ)過(guò)程可以分為以下三步:

(1) 打開(kāi)圖像數(shù)據(jù),獲得數(shù)據(jù)長(zhǎng)度;申請(qǐng)緩沖區(qū),把文件讀入此緩沖區(qū)。

(2) 構(gòu)造一個(gè)一維數(shù)組,把緩沖區(qū)中的數(shù)據(jù)拷貝到數(shù)組中,然后構(gòu)造一個(gè)變體對(duì)象,用數(shù)組來(lái)對(duì)此對(duì)象賦值。

(3) 調(diào)用appendchunk函數(shù),把數(shù)據(jù)存入recordset對(duì)象的本地緩沖區(qū)。

具體實(shí)現(xiàn)代碼如下:

if(m_pic.m_ipicture != null) m_pic.freepicturedata();

if(f.open(m_strphotopath, cfile::moderead |

cfile::typebinary, &e)) //打開(kāi)了一個(gè)圖像文件

{nsize = f.getlength();//先得到圖像數(shù)據(jù)長(zhǎng)度

byte * pbuffer = new byte [nsize];//根據(jù)數(shù)據(jù)的長(zhǎng)度申請(qǐng)緩沖區(qū)

if (f.read(pbuffer, nsize) 》 0 )//把圖像數(shù)據(jù)讀到緩沖區(qū)

{byte *pbuf = pbuffer;//把pbuffer里的jpg數(shù)據(jù)放到庫(kù)中

variant varblob;

safearray *psa;

safearraybound rgsabound[1];//創(chuàng)建safearray對(duì)象

if(pbuf)

{rgsabound[0].llbound = 0;

rgsabound[0].celements = nsize;

psa = safearraycreate(vt_ui1, 1, rgsabound);

for (long i = 0; i 《 (long)nsize; i++)safearrayputelement (psa, &i, pbuf++);

varblob.vt = vt_array | vt_ui1;

varblob.parray = psa;

m_precordset-》getfields()-》getitem(“picture”)-》appendchunk(varblob);

m_precordset-》update();//更新數(shù)據(jù)庫(kù)

}

delete [] pbuffer; //釋放緩沖區(qū)

pbuf=0;

}

f.close();

}

3.4 圖像數(shù)據(jù)的讀取

圖像數(shù)據(jù)的讀取過(guò)程可以分為以下三歩:

(1) 獲得picture字段中圖像文件的實(shí)際長(zhǎng)度。

(2) 調(diào)用getchunk函數(shù),返回變體對(duì)象。

(3) 獲得數(shù)組數(shù)據(jù)指針,把數(shù)據(jù)寫(xiě)入打開(kāi)的文件中。

具體實(shí)現(xiàn)代碼如下:

long nsize=m_precordset-》getfields()-》getitem(“picture ”)-》actualsize;//獲得圖像文件的長(zhǎng)度

if(nsize1 》 0)

{ varblob=m_precordset-》getfields()-》getitem

(“picture ”)-》getchunk(nsize);//獲得varblob的值

if(varblob.vt == (vt_array | vt_ui1))

{char *pbuf = null;

lpvoid pbuf2 = null;

safearrayaccessdata(varblob.parray,

(void **)&pbuf);//獲得數(shù)組數(shù)據(jù)指針

hglobal=globalalloc(gmem_moveable,nsize);

pbuf2 = globallock(hglobal);

memcpy(pbuf2,pbuf,nsize1);//復(fù)制數(shù)據(jù)到緩沖區(qū)

::globalunlock(hglobal);

safearrayunaccessdata (varblob.parray);

hr=::createstreamonhglobal( hglobal,true, &pstream );

hr=::oleloadpicture( pstream, nsize1, true, iid_ipicture, (lpvoid * )&ppicture );

ppicture-》render(pdc-》m_hdc,0,0,rect.width(),rect.height(),0,nheight,nwidth,-nheight,null);//將圖像數(shù)據(jù)顯示在用戶界面

}

}

4 、應(yīng)用mfc odbc訪問(wèn)圖像數(shù)據(jù)

4.1 mfc odbc的介紹

odbc(open database connect-ivity)是微軟公司開(kāi)放服務(wù)結(jié)構(gòu)中有關(guān)數(shù)據(jù)庫(kù)的一個(gè)組成部分。mfc的odbc類對(duì)較復(fù)雜的odbcapi進(jìn)行了封裝,提供了簡(jiǎn)化的調(diào)用接口,方便了數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)發(fā)。

mfcodbc類主要包括cdatabase類、crecordset類和cfieldexchange類。cdatabase類的主要功能是建立與數(shù)據(jù)庫(kù)的連接;crecordset類針對(duì)數(shù)據(jù)源中記錄集,它負(fù)責(zé)對(duì)記錄的操作;cfieldexchange類負(fù)責(zé)crecordset與數(shù)據(jù)源的數(shù)據(jù)交換。

4.2 配置odbc數(shù)據(jù)源

用odbc管理器定義了一個(gè)數(shù)據(jù)源,管理器根據(jù)數(shù)據(jù)源所在的位置,數(shù)據(jù)庫(kù)類型及odbc驅(qū)動(dòng)器信息,建立起odbc與具體數(shù)據(jù)庫(kù)之間的聯(lián)系。在windowsxp的系統(tǒng)中,配置odbc數(shù)據(jù)源的過(guò)程為:控制面板—性能和維護(hù)—管理工具—數(shù)據(jù)源(odbc)。

4.3 odbc連接數(shù)據(jù)庫(kù)

創(chuàng)建cdatabase對(duì)象并連接數(shù)據(jù)庫(kù):

cdatabase m_db;//定義的數(shù)據(jù)庫(kù)全局變量

cbitmap bitmap;//定義的圖像類全局變量,存儲(chǔ)圖像數(shù)據(jù)

m_db.open(null, false, false, “odbc;driver={microsoft accessdriver (*.mdb)};

dbq= picture.mdb”);

4.4 圖像數(shù)據(jù)的存儲(chǔ)

首先做一些變量的定義:

m_ picture為picture字段對(duì)應(yīng)的長(zhǎng)二進(jìn)制成員變量;

m_hdata用來(lái)存放picture字段的數(shù)據(jù);

m_dwdatalength為picture字段的實(shí)際長(zhǎng)度。

圖像數(shù)據(jù)的存儲(chǔ)過(guò)程可以分為以下三步:

(1) 打開(kāi)圖像數(shù)據(jù),獲得數(shù)據(jù)長(zhǎng)度;

(2) 申請(qǐng)緩沖區(qū),把文件讀入此緩沖區(qū);

(3) 通過(guò)調(diào)用update()刷新數(shù)據(jù)庫(kù)記錄。

具體實(shí)現(xiàn)代碼如下:

static char based_code s***ilter[]=“bitmap files(*.bmp)|*.bmp||”;

cdbimages dbimages(m_db);

cfiledialog fd(true,null,null,0,s***ilter,this);

if (idok != fd.domodal()) return;

dbimages.open();

dbimages.addnew();

cfile fileimage;

cfilestatus filestatus;

fileimage.open(fd.getpathname(), cfile::moderead);

fileimage.getstatus(filestatus);//獲得打開(kāi)圖像文件的狀態(tài)

dbimages.m_ picture.m_dwdatal -ength =filestatus.m_size;

hglobal hglobal=globalalloc(gptr,filestatus.m_size);//分配內(nèi)存

dbimages.m_ picture.m_hdata = globallock(hglobal);//鎖定內(nèi)存

fileimage.readhuge(dbimages.m_picture.m_hdata,filestatus.m_size);//向緩沖區(qū)讀取圖像數(shù)據(jù)

dbimages.setfielddirty(&dbimages.m_ picture);//修改標(biāo)志數(shù)據(jù)庫(kù)

dbimages.setfieldnull(&dbim -ages.m_ picture,false);

dbimages.update();//刷新數(shù)據(jù)庫(kù)的記錄

globalunlock(hglobal);

dbimages.close();

4.5 圖像數(shù)據(jù)的讀取

圖像數(shù)據(jù)的讀取過(guò)程可以分為以下三步:

(1) 定義臨時(shí)文件。

(2) 向臨時(shí)文件中存放從數(shù)據(jù)庫(kù)中讀取到的圖像數(shù)據(jù)。

(3) 取出圖像數(shù)據(jù),獲得圖像數(shù)據(jù)的寬度和高度。

具體實(shí)現(xiàn)代碼如下:

cdbimages dbimages(m_db);

cstring strfilename ;

i=1;

strfilename.format(“%s”,i)dbimages.open();

if (dbimages.iseof())afxmessagebox(“unable to get image from picture”);

else{char tmppath[_max_path 1];

gettemppath(_max_path,tmppath);

strfilename.insert(0,tmppath);

cfile outfile(strfilename,cfile::modecreate

|cfile::modewrite);

lpstr buffer=(lpstr)globallock(dbimages.m_ picture.m_hdata);

outfile.writehuge(buffer,dbima -ges.m_picture.m_dwdatalength);

globalunlock(dbimages.m_ picture.m_hdata);

outfile.close();

hbitmap hbm=(hbitmap)::loa -dimage(null,strfilename,image_bitmap, 0, 0, lr_loadfromfile);

if (bitmap.attach(hbm)) { bitmap bm;

bitmap.getbitmap(&bm); //獲得圖像的尺寸

bitmap.setbitmapdimension(bm.bmwidth,bm.bmheight);//獲得圖像的寬度和高度

}

5 、結(jié)束語(yǔ)

介紹了使用ado技術(shù)和mfcodbc在access中存儲(chǔ)和讀取圖像數(shù)據(jù)的方法以及部分程序代碼。這兩種訪問(wèn)方法在vc++7.0的環(huán)境下進(jìn)行調(diào)試結(jié)果顯示,使用ado來(lái)訪問(wèn)數(shù)據(jù)庫(kù)中的圖像數(shù)據(jù)更加的方便,更加的高效,使用mfcodbc方法訪問(wèn)大對(duì)象數(shù)據(jù)的速度相對(duì)較慢。在開(kāi)發(fā)擴(kuò)展時(shí)會(huì)發(fā)現(xiàn)mfcodbc不能用于其他的非關(guān)系數(shù)據(jù)庫(kù),使用的范圍相對(duì)較窄。這兩種方法還可以應(yīng)用于其他二進(jìn)制大對(duì)象數(shù)據(jù)的訪問(wèn)。

責(zé)任編輯:gt


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6819

    瀏覽量

    88746
  • 視頻
    +關(guān)注

    關(guān)注

    6

    文章

    1930

    瀏覽量

    72774
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4228

    瀏覽量

    85580
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C,C++,VC,VC++,MFC,API......

    C,C++,VC,VC++,MFC,API......發(fā)現(xiàn)總有人把這些東西搞混,簡(jiǎn)單解釋一下.C,C++都是編程語(yǔ)言,兩者是不同的,不要認(rèn)為C++是C的升級(jí).C是面向過(guò)程的,C++是面向?qū)ο?封裝
    發(fā)表于 10-07 11:09

    使用MFC ODBC訪問(wèn)數(shù)據(jù)庫(kù)

    使用MFC ODBC訪問(wèn)數(shù)據(jù)庫(kù)在VC環(huán)境下運(yùn)行程序前,必須注冊(cè)ODBC
    發(fā)表于 10-15 11:40

    使用ODBC API訪問(wèn)數(shù)據(jù)庫(kù)

    使用ODBC API訪問(wèn)數(shù)據(jù)庫(kù)要運(yùn)行程序,必須將數(shù)據(jù)庫(kù)文件與可執(zhí)行文件放在同一個(gè)目錄下,在VC開(kāi)發(fā)環(huán)境中運(yùn)行時(shí),同樣需要把
    發(fā)表于 10-15 11:42

    ADO數(shù)據(jù)存儲(chǔ)模塊的問(wèn)題

    數(shù)據(jù)存儲(chǔ)模塊出現(xiàn)錯(cuò)誤提示:ADO Connection Execute.vi->SQL Execute.vi->數(shù)值寫(xiě)入數(shù)據(jù)庫(kù)(字符串時(shí)間).vi中的Exception occured
    發(fā)表于 05-30 12:02

    VC6數(shù)據(jù)庫(kù)綜合開(kāi)發(fā)資料相關(guān)資料下載

    VC6數(shù)據(jù)庫(kù)綜合開(kāi)發(fā)資料目錄 用VC++6.0開(kāi)發(fā)多表聯(lián)接的數(shù)據(jù)庫(kù)應(yīng)用程序《使用OLEDB編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序》《在Visual C++中用
    發(fā)表于 09-17 08:55

    什么是ODBC/MFC?

    什么是ODBC/MFC?
    發(fā)表于 11-11 07:47

    深入ADO.NET開(kāi)發(fā)高級(jí)數(shù)據(jù)訪問(wèn)技術(shù)

    深入ADO.NET開(kāi)發(fā)高級(jí)數(shù)據(jù)訪問(wèn)技術(shù)
    發(fā)表于 01-08 09:19 ?0次下載
    深入<b class='flag-5'>ADO</b>.NET開(kāi)發(fā)高級(jí)<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>訪問(wèn)</b><b class='flag-5'>技術(shù)</b>

    基于VC++MFC的上位機(jī)與PLC的通訊系統(tǒng)The Com

    本文介紹了用VC++MFC開(kāi)發(fā)的上位機(jī)和PLC的通訊系統(tǒng),給出了系統(tǒng)的通訊原理和系統(tǒng)的軟件設(shè)計(jì)方法。實(shí)踐證明整個(gè)系統(tǒng)運(yùn)行穩(wěn)定,實(shí)用性和可擴(kuò)展性強(qiáng)。關(guān)鍵詞:PLC;VC++;MFC;通
    發(fā)表于 05-26 13:13 ?33次下載

    基于VC++MFC 的上位機(jī)與PLC 的通訊系統(tǒng)

    本文介紹了用VC++MFC 開(kāi)發(fā)的上位機(jī)和PLC 的通訊系統(tǒng),給出了系統(tǒng)的通訊原理和系統(tǒng)的軟件設(shè)計(jì)方法。實(shí)踐證明整個(gè)系統(tǒng)運(yùn)行穩(wěn)定,實(shí)用性和可擴(kuò)展性強(qiáng)。關(guān)鍵詞:PLC VC++ MFC
    發(fā)表于 06-04 10:49 ?42次下載

    基于VC++ADO的燃?xì)庹{(diào)壓站管理系統(tǒng)開(kāi)發(fā)

    本文介紹了一個(gè)基于VisualC++ 6.0 開(kāi)發(fā)平臺(tái)的管理系統(tǒng)數(shù)據(jù)庫(kù)的開(kāi)發(fā)過(guò)程,該系統(tǒng)采用ADO 數(shù)據(jù)庫(kù)訪問(wèn)技術(shù),實(shí)現(xiàn)了
    發(fā)表于 08-15 09:08 ?27次下載

    利用ADO實(shí)現(xiàn)對(duì)多個(gè)數(shù)據(jù)庫(kù)的訪問(wèn)

    本文分析了在做實(shí)際項(xiàng)目中所遇到的問(wèn)題,提出了可行的解決方法。主要介紹了利用ADO Connection和ADO Recordset 對(duì)象訪問(wèn)多個(gè)數(shù)據(jù)庫(kù)中多個(gè)表單的靈活
    發(fā)表于 09-10 16:12 ?15次下載

    ADO簡(jiǎn)介,什么是ADO,ADO是什么意思?

    ADO 簡(jiǎn)介 1、ADO是什么ADO(ActiveX Data Object)是OLE DB數(shù)據(jù)訪問(wèn)方式 的一種主要對(duì)象模型。
    發(fā)表于 05-10 11:01 ?1.9w次閱讀
    <b class='flag-5'>ADO</b>簡(jiǎn)介,什么是<b class='flag-5'>ADO</b>,<b class='flag-5'>ADO</b>是什么意思?

    ADO.NET數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)

    ADO.NET是在.NET Framework上訪問(wèn)數(shù)據(jù)庫(kù)的一組類庫(kù),它利用.NET Data Provider(數(shù)據(jù)提供程序)以進(jìn)行數(shù)據(jù)庫(kù)
    發(fā)表于 03-26 15:15 ?16次下載

    vc++應(yīng)用程序和使用vc++設(shè)計(jì)的MFC計(jì)時(shí)器和計(jì)算機(jī)程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是vc++應(yīng)用程序和使用vc++設(shè)計(jì)的MFC計(jì)時(shí)器和計(jì)算機(jī)程序免費(fèi)下載。
    發(fā)表于 12-24 08:00 ?15次下載
    <b class='flag-5'>vc++</b>應(yīng)用程序和使用<b class='flag-5'>vc++</b>設(shè)計(jì)的<b class='flag-5'>MFC</b>計(jì)時(shí)器和計(jì)算機(jī)程序免費(fèi)下載

    VC+ADO+ORACLE開(kāi)發(fā)講解

    VC+ADO+ORACLE開(kāi)發(fā)講解(電源技術(shù)發(fā)展)-該文檔為VC+ADO+ORACLE開(kāi)發(fā)講解文檔,是一份還算不錯(cuò)的參考文檔,感興趣的可以下載看看,,,,,,,,,,,,,,,,,,
    發(fā)表于 09-28 09:20 ?2次下載
    <b class='flag-5'>VC+ADO</b>+ORACLE開(kāi)發(fā)講解