色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

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

1 、引言

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

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

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

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

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

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

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

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

3.1 ado的介紹

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

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

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

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

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

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

(2) 初始化com庫

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

:: coinitialize(null);

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

創(chuàng)建connection對象:

_connectionptr m_pconnection;

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

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

_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ù)的存儲

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

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

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

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

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

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

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

cfile::typebinary, &e)) //打開了一個圖像文件

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

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

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

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

variant varblob;

safearray *psa;

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

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ù)庫

}

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

pbuf=0;

}

f.close();

}

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

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

(1) 獲得picture字段中圖像文件的實際長度。

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

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

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

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

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訪問圖像數(shù)據(jù)

4.1 mfc odbc的介紹

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

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

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

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

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

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

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

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

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

dbq= picture.mdb”);

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

首先做一些變量的定義:

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

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

m_dwdatalength為picture字段的實際長度。

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

(1) 打開圖像數(shù)據(jù),獲得數(shù)據(jù)長度;

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

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

具體實現(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);//獲得打開圖像文件的狀態(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ù)庫

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

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

globalunlock(hglobal);

dbimages.close();

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

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

(1) 定義臨時文件。

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

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

具體實現(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é)束語

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

責(zé)任編輯:gt


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

    關(guān)注

    8

    文章

    7067

    瀏覽量

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

    關(guān)注

    6

    文章

    1947

    瀏覽量

    72939
  • 存儲
    +關(guān)注

    關(guān)注

    13

    文章

    4320

    瀏覽量

    85903
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    使用MFC ODBC訪問數(shù)據(jù)

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

    使用ODBC API訪問數(shù)據(jù)

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

    ADO數(shù)據(jù)存儲模塊的問題

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

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

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

    什么是ODBC/MFC?

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

    深入ADO.NET開發(fā)高級數(shù)據(jù)訪問技術(shù)

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

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

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

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

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

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

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

    利用ADO實現(xiàn)對多個數(shù)據(jù)庫的訪問

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

    ADO簡介,什么是ADO,ADO是什么意思?

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

    ADO.NET數(shù)據(jù)訪問技術(shù)

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

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

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

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

    VC+ADO+ORACLE開發(fā)講解(電源技術(shù)發(fā)展)-該文檔為VC+ADO+ORACLE開發(fā)講解文檔,是一份還算不錯的參考文檔,感興趣的可以下載看看,,,,,,,,,,,,,,,,,,
    發(fā)表于 09-28 09:20 ?2次下載
    <b class='flag-5'>VC+ADO</b>+ORACLE開發(fā)講解
    主站蜘蛛池模板: 伦理电影2499伦理片| 日韩亚洲欧洲在线rrrr片| 紧缚束缚调教丨vk| 精品含羞草免费视频观看| 精品亚洲一区二区在线播放| 九九热在线视频| 美女被免费喷白浆视频| 欧美精品一卡二卡| 四虎永久在线精品国产| 亚洲精品一二三| 中文字幕免费在线视频| 把腿张开再深点好爽宝贝动态图| 鬼灭之刃花街篇免费樱花动漫 | 欧美亚洲韩日午夜| 三级网址在线播放| 亚洲精品久久久无码一区二区 | 欧美最猛12teevideos欧美| 肉肉的各种姿势高H细文| 亚洲第一色网| 538prom精品视频我们不只是 | 亚洲精品天堂在线| 97在线超碰免费视频| 国产 交换 丝雨 巅峰| 精品三级在线观看| 彭丹吃奶门| 亚洲精品久久久久一区二区三| 68日本xxxxxxxx79| 国产成人综合在线视频| 久久高清一本无码| 日本湿姝在线观看| 野花4在线观看| 扒开胸罩揉她的乳尖视频| 国产人妻人伦精品836700| 久久久擼擼擼麻豆| 日韩一区二区天海翼| 亚洲手机在线人成视频| gay吊粗大双龙| 娇小老少配xxxxx| 日本久久道一区二区三区| 亚洲午夜精品久久久久久抢| www色小姐|