在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用ado技術和mfc odbc技術的VC++圖像數據訪問研究

電子設計 ? 來源:電子產品世界 ? 作者:佚名 ? 2020-02-25 08:07 ? 次閱讀

1 、引言

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

在vc++中標準的訪問數據庫技術有很多種,根據開發的項目,采用了數據庫技術中最常見有效的兩種技術ado技術和mfc odbc在access數據庫中訪問圖像數據。

2、 圖像數據訪問原理

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

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

使用ado技術和mfc odbc技術的VC++圖像數據訪問研究

圖1 圖像數據訪問原理圖

3、 應用ado訪問圖像數據

3.1 ado的介紹

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

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

3.2 ado連接數據庫

(1) 導入ado庫

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

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

(2) 初始化com庫

ado本身是一個com組件,在使用時需要初始化com庫,需要調用coinitialize函數來實現。

:: coinitialize(null);

(3) 創建connection對象并連接數據庫

創建connection對象:

_connectionptr m_pconnection;

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

連接數據庫:

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

(4) 執行操作

m_precordset.createinstance(“adodb.recordset”);

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

3.3 圖像數據的存儲

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

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

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

(3) 調用appendchunk函數,把數據存入recordset對象的本地緩沖區。

具體實現代碼如下:

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

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

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

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

byte * pbuffer = new byte [nsize];//根據數據的長度申請緩沖區

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

{byte *pbuf = pbuffer;//把pbuffer里的jpg數據放到庫中

variant varblob;

safearray *psa;

safearraybound rgsabound[1];//創建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();//更新數據庫

}

delete [] pbuffer; //釋放緩沖區

pbuf=0;

}

f.close();

}

3.4 圖像數據的讀取

圖像數據的讀取過程可以分為以下三歩:

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

(2) 調用getchunk函數,返回變體對象。

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

具體實現代碼如下:

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);//獲得數組數據指針

hglobal=globalalloc(gmem_moveable,nsize);

pbuf2 = globallock(hglobal);

memcpy(pbuf2,pbuf,nsize1);//復制數據到緩沖區

::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);//將圖像數據顯示在用戶界面

}

}

4 、應用mfc odbc訪問圖像數據

4.1 mfc odbc的介紹

odbc(open database connect-ivity)是微軟公司開放服務結構中有關數據庫的一個組成部分。mfc的odbc類對較復雜的odbcapi進行了封裝,提供了簡化的調用接口,方便了數據庫應用程序的開發。

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

4.2 配置odbc數據源

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

4.3 odbc連接數據庫

創建cdatabase對象并連接數據庫:

cdatabase m_db;//定義的數據庫全局變量

cbitmap bitmap;//定義的圖像類全局變量,存儲圖像數據

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

dbq= picture.mdb”);

4.4 圖像數據的存儲

首先做一些變量的定義:

m_ picture為picture字段對應的長二進制成員變量;

m_hdata用來存放picture字段的數據;

m_dwdatalength為picture字段的實際長度。

圖像數據的存儲過程可以分為以下三步:

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

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

(3) 通過調用update()刷新數據庫記錄。

具體實現代碼如下:

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);//獲得打開圖像文件的狀態

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

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

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

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

dbimages.setfielddirty(&dbimages.m_ picture);//修改標志數據庫

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

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

globalunlock(hglobal);

dbimages.close();

4.5 圖像數據的讀取

圖像數據的讀取過程可以分為以下三步:

(1) 定義臨時文件。

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

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

具體實現代碼如下:

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 、結束語

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

責任編輯:gt


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7067

    瀏覽量

    89125
  • 視頻
    +關注

    關注

    6

    文章

    1947

    瀏覽量

    72946
  • 存儲
    +關注

    關注

    13

    文章

    4320

    瀏覽量

    85911
收藏 人收藏

    評論

    相關推薦

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

    C,C++,VC,VC++,MFC,API......發現總有人把這些東西搞混,簡單解釋一下.C,C++都是編程語言,兩者是不同的,不要認為C++是C的升級.C是面向過程的,C++是面向對象(封裝
    發表于 10-07 11:09

    使用MFC ODBC訪問數據

    使用MFC ODBC訪問數據庫在VC環境下運行程序前,必須注冊ODBC
    發表于 10-15 11:40

    使用ODBC API訪問數據

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

    ADO數據存儲模塊的問題

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

    VC6數據庫綜合開發資料相關資料下載

    VC6數據庫綜合開發資料目錄 用VC++6.0開發多表聯接的數據庫應用程序《使用OLEDB編寫數據庫應用程序》《在Visual C++中用
    發表于 09-17 08:55

    什么是ODBC/MFC?

    什么是ODBC/MFC?
    發表于 11-11 07:47

    深入ADO.NET開發高級數據訪問技術

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

    基于VC++MFC的上位機與PLC的通訊系統The Com

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

    基于VC++MFC 的上位機與PLC 的通訊系統

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

    基于VC++ADO的燃氣調壓站管理系統開發

    本文介紹了一個基于VisualC++ 6.0 開發平臺的管理系統數據庫的開發過程,該系統采用ADO 數據訪問技術,實現了
    發表于 08-15 09:08 ?27次下載

    利用ADO實現對多個數據庫的訪問

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

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

    ADO 簡介 1、ADO是什么ADO(ActiveX Data Object)是OLE DB數據訪問方式 的一種主要對象模型。
    發表于 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數據訪問技術

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

    vc++應用程序和使用vc++設計的MFC計時器和計算機程序免費下載

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

    VC+ADO+ORACLE開發講解

    VC+ADO+ORACLE開發講解(電源技術發展)-該文檔為VC+ADO+ORACLE開發講解文檔,是一份還算不錯的參考文檔,感興趣的可以下載看看,,,,,,,,,,,,,,,,,,
    發表于 09-28 09:20 ?2次下載
    <b class='flag-5'>VC+ADO</b>+ORACLE開發講解
    主站蜘蛛池模板: 免费看h的网站| 花怜write. as| 亚洲色图视频在线| 四虎影院视频在线观看| 欧美成人精品福利网站| 狠狠曹| 天天在线影院| h录音 国产 在线| 国产精品美女免费视频观看| 四虎影视地址| 三级在线观看视频| 成人国产亚洲欧美成人综合网| 免费看一级毛片| 一级特黄a大片免费| 午夜国产精品久久久久| 午夜影院h| 三级理论片| 日本免费在线一区| 福利视频一区二区微拍堂| 久99频这里只精品23热 视频| 刺激第一页720lu久久| 1024视频在线观看国产成人| 四虎影院在线观看网站| 综合网自拍| 欧美成人午夜精品一区二区| 久久精品人| 天天做天天爱天天综合网2021| www.亚洲视频.com| 美女艹逼视频| hs网站免费| 乱色伦图片区| 国产男靠女免费视频网站| 狠狠色婷婷七月色综合| 天堂社区在线观看| 鲁老汉精品视频在线观看| chinese国产videoxx实拍| 国产资源站| 爱爱免费网站| 丁香婷婷视频| 国产片91人成在线观看| 精品一区二区视频|