摘要:VB數(shù)據(jù)庫中圖像數(shù)據(jù)的存取對初學(xué)者來說是個難點,文章總結(jié)了綁定圖片控件、存儲圖片文件路徑、利用PropertyBag對象與Byte數(shù)組中轉(zhuǎn)三種較為簡便的方法以供初學(xué)者參考。
關(guān)鍵詞:VB;Data控件;數(shù)據(jù)庫;圖片;存??;路徑;PropertyBag;Byte數(shù)組
文章編號:1672-5913(2010)08-0125-04
中圖分類號:G642
文獻標(biāo)識碼:B
圖像數(shù)據(jù)的存取對初學(xué)者來說是個難點,而當(dāng)前的VB教學(xué)因課時較短,所選教材或講授過程對數(shù)據(jù)庫一章要么忽略要么只是簡單地介紹,很少涉及到圖像的存取問題,而專業(yè)數(shù)據(jù)庫開發(fā)書籍中的大量源代碼又讓初學(xué)者看得頭疼,所以本文總結(jié)了3種相對簡便的方法以供參考。
為順利運行程序,以下每種方法中,圖片文件夾和數(shù)據(jù)庫文件、VB程序文件同時存儲在同一目錄下。
1 綁定圖片控件
實現(xiàn)思路:用VB自帶VisData建立數(shù)據(jù)庫,把圖片存儲在數(shù)據(jù)庫表的Binary字段中,通過常用工具箱中Data控件與Image控件綁定,添加CommonDialog部件用以選擇圖片文件,在Image的DblClick事件中打開通用對話框,用LoadPicture函數(shù)把選定的圖片載入Image,用Data控件的四個箭頭瀏覽記錄。
1.1建立圖片文件夾
建立圖片文件夾bmp,把準備好的圖片(本例選用bmp、jpg、gif格式)放入其中,以備程序運行時添加和修改用。
1.2建立數(shù)據(jù)庫
啟動外接程序下的可視化數(shù)據(jù)管理器VisData,建立stu數(shù)據(jù)庫,新建xs表,包含學(xué)號、姓名、照片(類型Binary)3個字段。因Binary型字段在表中無法直接操作,所以生成表后并不需添加記錄,等程序運行時添加即可。
1.3界面設(shè)計
在窗體上添加2個標(biāo)簽、2個文本框,2個命令按鈕,1個Data控件,1個圖像框,1個CommonDialog控件;設(shè)置圖像框的BodyStyle屬性為1,Stretch屬性設(shè)置為True;設(shè)置Data控件DataBaseName屬性為stu.mdb,RecordSource屬性為xs,設(shè)置Textl、Text2的DataSource屬性Datal,Textl的DataField屬性為姓名,Text2的DataField屬性為學(xué)號:標(biāo)簽與命令按鈕屬性設(shè)置如圖1所示。
1.4代碼編寫
Data控件自動提供了修改現(xiàn)有記錄的能力,當(dāng)直接改變和DATA綁定的控件的值后,只需單擊Data控件上任一箭頭,即可保存所做的修改。為防止任意修改,本例中在窗體的Load事件里使文本框只讀(Locked屬性為False)和圖象框禁用(Enabled屬性True),并在調(diào)用記錄集的AddNew和Update方法中根據(jù)需要進行了改變。完整源碼如下。
2 存取圖像文件的路徑
實現(xiàn)思路:VisData數(shù)據(jù)庫建庫,圖片以路徑的形式存儲在文本型字段中,用Data控件綁定存儲路徑的字段,用CommonDialog選擇圖片,如在指定圖片路徑下不存在該圖片,則調(diào)用API函數(shù)CopyFile復(fù)制圖片到指定路徑,再用LoadPicture函數(shù)把圖片載入Image,利用Data控件的四個箭頭瀏覽、保存記錄。
2.1建立圖片文件夾
建立圖片文件夾pic,把準備好的缺省圖片文件Rose.bmp放入其中,其他圖片文件可現(xiàn)在放入也可在運行時選擇并復(fù)制。
2.2建立數(shù)據(jù)庫
啟動VisData建立數(shù)據(jù)庫fm.mdb,表cy,包含姓名、照片2個Text類型字段,并設(shè)置姓名字段的缺省值“Rose”,照片字段的缺省值“pic\Rose.bmp”,以備新增記錄時Reposition事件代碼的正常運行。
2.3設(shè)計界面
界面設(shè)計同方法二,只是照片字段綁定的是Text2而非Imagel,具體設(shè)計如圖2所示。
2.4代碼編寫
因與Data控件綁定的是存儲路徑的字段,為隨記錄的變化而動態(tài)把字段存儲的路徑賦值給Image控件的Picture屬性,本方法調(diào)用了Data控件的Reposition事件。完整源碼如下:
3
利用PropertyBag對象與Byte數(shù)組
實現(xiàn)思路:Access2003建庫,圖片存儲在OLE類型字段中,引用ADO 2.7 library進行數(shù)據(jù)庫連接,用PropertyBag對象與Byte數(shù)組中轉(zhuǎn)存取圖片。
3.1數(shù)據(jù)庫設(shè)計
啟動Access2003,建立數(shù)據(jù)庫book.mdb,表shu,包含書名(文本類型)、圖片(OLE對象)2個字段。因程序中Byte數(shù)組存取的是長二進制數(shù)據(jù),所以不要在表建立后通過“插入對象”命令輸入圖像數(shù)據(jù)。
3.2界面設(shè)計
新建工程,引用ADO 2.7,界面具體設(shè)計如圖3所示。
3.3代碼編寫
本文中主要列出了數(shù)據(jù)庫的連接、圖片的顯示與保存代碼,而記錄的瀏覽與增刪通過調(diào)用記錄集的AddNew、Delete、Move等方法實現(xiàn),記得在相關(guān)方法后用ShowData顯示數(shù)據(jù),核心代碼如下:
(4)窗體載入時用ADODB建立數(shù)據(jù)庫連接,再調(diào)用ShowData函數(shù)顯示數(shù)據(jù)。
4 結(jié)語
除本文介紹的3種方法外,數(shù)據(jù)庫存取圖片的常見方法還有兩種:一種是利用ADO對象的AppendChunk和GetChunk方法,這涉及到對二進制數(shù)據(jù)的讀寫和臨時文件的建立操作,步驟多,操作復(fù)雜,不適合初學(xué)者;第二種是利用ADO的Stream對象,雖Stream對象的引入已大大簡化了二進制字段的操作,但還是要留下臨時文件。與此兩種方法相比,筆者所介紹的三種方法都無需對二進制文件直接進行存取,不會產(chǎn)生臨時文件,代碼編寫簡單,操作步驟少,所以很適合初學(xué)者使