錢曉燕
摘 要:在數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中,經(jīng)常需要對(duì)圖片進(jìn)行處理,包括圖片在數(shù)據(jù)庫(kù)中的直接存儲(chǔ)和只將圖片地址存儲(chǔ)于數(shù)據(jù)庫(kù)中兩種存儲(chǔ)方式。本文主要論述了圖片的存儲(chǔ)方式、讀取方式,它們各自的優(yōu)缺點(diǎn)以及怎樣存取才能達(dá)到效率最高。
關(guān)鍵詞:移植性 數(shù)據(jù)負(fù)擔(dān) OlE 對(duì)象 圖片地址
中圖分類號(hào):G718 ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1674-2117(2014)22-00-01
在教學(xué)中,我們常常會(huì)用VB及Access做些小的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng),如學(xué)籍管理系統(tǒng)、考試系統(tǒng)、圖書(shū)管理系統(tǒng)等,在這些數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中,經(jīng)常需要對(duì)圖片進(jìn)行處理。圖片在數(shù)據(jù)庫(kù)中應(yīng)該如何存取、怎樣存取才能達(dá)到效率最高,是我們最常碰到又急需解決的問(wèn)題。
1 圖片在數(shù)據(jù)庫(kù)中的存儲(chǔ)
以考試管理系統(tǒng)為例來(lái)說(shuō),在考試報(bào)名界面上必須有考試照片,而這照片必須存入后臺(tái)數(shù)據(jù)庫(kù)中。圖書(shū)管理系統(tǒng)新書(shū)入庫(kù)時(shí)需將新書(shū)封面圖片存入數(shù)據(jù)庫(kù)等。
一般來(lái)說(shuō),圖片在數(shù)據(jù)庫(kù)中的存儲(chǔ)有兩種方式:直接將圖片存儲(chǔ)在數(shù)據(jù)庫(kù)中和在數(shù)據(jù)庫(kù)中存儲(chǔ)圖片地址。
1.1 直接將圖片存儲(chǔ)在數(shù)據(jù)庫(kù)
這種存儲(chǔ)方式采用的是數(shù)據(jù)流技術(shù)。數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),存儲(chǔ)圖片的字段數(shù)據(jù)類型定義為“OLE對(duì)象”。要插入圖片直接雙擊該字段即可。若要在程序中寫(xiě)入數(shù)據(jù)庫(kù),實(shí)現(xiàn)代碼如下:
SUB ?SFILE()
DIM ?STR ?As ADODB.STREAM
DIM ?REAS ADODB.RECORDSET
DIM ?STR ?AS STRING
SET ?STM = NEW ADODB.STREAM
STM.TYPE= ADTYPEBINARY
STM.OPEN
STM.LOADFROMFILE APP.PATH+”\ABC.JPG”
SET ?RE= NEW ADODB.RECORDESET
RE.OPEN”SELECT * ?FROM ?IMG” ,STM,1,3
RE.ADDNEW
RE.FIELDS(“PHOTO”)=STM.READ
RE.UPDATE
RE.CLOSE
STM.CLOSE
END SUB
從代碼看圖片操作與其他字段寫(xiě)入數(shù)據(jù)庫(kù)基本一樣,只不過(guò)使用的是流對(duì)象。它的優(yōu)點(diǎn)是移植性好,不受系統(tǒng)前臺(tái)程序約束,可在不同地方使用;缺點(diǎn)是加大了數(shù)據(jù)庫(kù)的負(fù)擔(dān),在圖片量大的情況下會(huì)導(dǎo)致數(shù)據(jù)讀取、備份等操作緩慢。
1.2 將圖片地址存儲(chǔ)在數(shù)據(jù)庫(kù)中
這種方式對(duì)數(shù)據(jù)庫(kù)的操作簡(jiǎn)單,主要操作都在程序與操作系統(tǒng)之間的通信上了。只要將存儲(chǔ)圖片的字段數(shù)據(jù)類型定義為字符型即可。其操作與存儲(chǔ)字符數(shù)據(jù)相同,用這樣的方式首先要在代碼中獲取圖片的地址,其他與存儲(chǔ)普通類型數(shù)據(jù)代碼類似。它的優(yōu)點(diǎn)是只存儲(chǔ)字符數(shù)據(jù),數(shù)據(jù)庫(kù)負(fù)擔(dān)小,易于讀取備份等;缺點(diǎn)是系統(tǒng)移植不方便,需要同時(shí)移植圖片文件夾。
以上的兩種方式都各有缺點(diǎn),具體選用哪種方法要看所做系統(tǒng)的具體情況而定,一般來(lái)說(shuō),考慮到數(shù)據(jù)庫(kù)的優(yōu)化,一般采用存儲(chǔ)圖片地址這種存儲(chǔ)方式。
2 圖片從數(shù)據(jù)庫(kù)中的讀取
圖片存入數(shù)據(jù)庫(kù)是為了后期前臺(tái)使用,如查詢某考生的報(bào)考信息,則要調(diào)出考生照片,查詢某本書(shū)籍資料,也要有相應(yīng)的封面圖片信息調(diào)出。
圖片的存儲(chǔ)有兩種方式,相應(yīng)的,從數(shù)據(jù)庫(kù)中讀取圖片也有兩種方式。
2.1 讀取直接存儲(chǔ)在數(shù)據(jù)庫(kù)中的圖片
由于存儲(chǔ)時(shí)使用的是流對(duì)象 ADODB.STREAM,那么讀取也需要流對(duì)象,代碼如下:
SUB ?RFILE()
DIM STM ?AS ADODB.STREAM
DIM RE ?AS ?ADODB.RECORDSET
RE.OPEN “ select top 1* from ?img order by ?id desc”, ?iConc, adOpenKeyset , ?adLockReadOnly
SET STM =NEW ADODB.STREAM
STM.MODE=ADMODEREADWRITE
STM.TYPE= ADTYPEBINARY
STM.OPEN
STM.WRITE RE(“PHOTO”)
STM.SAVE TOFILE APP.PATH&”\ABC.JPG”
IMAGE1.
PICTURE=LOADPICTURE(APP.PATH&”\ABC.JPG”)
RE.CLOSE
STM.CLOSE
END SUB
2.2 讀取將地址存儲(chǔ)在數(shù)據(jù)庫(kù)中的圖片
將地址存儲(chǔ)于數(shù)據(jù)庫(kù)中的圖片則容易處理,直接調(diào)用獲取字段值,再使用LOADPICTURE 函數(shù)顯示圖片即可。例如,要實(shí)現(xiàn)如圖窗體功能,代碼如下:
PRIVATE ?SUB ?COMMAND1_CLICK()
DIM CN AS ADODB.CONNECTIN
DIM RS AS ADODB.RECORDSET
DIM STR AS STRING
SET CN= NEW ADODB.CONNECTION
SET RS=NEW ADODB.RECORDSETCN.OPEN“PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=C:\EXCISE\FILE.MDB;PERSISR SECURITY INFO =FALSE”
SQL=”SELECT * ?FROM ?STUDENT ?WHEREXM=”張一””
Rs.open sql,cn ,1,1
TEXT1.TEXT=RS(“XM”)
TEXT2.TEXT=RS(“SEX”)
STR=RS(“PHOTO”)
IMAGE1.
PICTURE=LOADPICTURE(STR)
END SUB
由上述代碼可知,圖片的讀取主要是獲取路徑后,使用函數(shù)LOADPICTURE 來(lái)顯示。當(dāng)然讀取圖片需要原來(lái)的路徑,否則將無(wú)法顯示。
總之在設(shè)計(jì)的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中采用什么樣的圖片存取方法,如何使系統(tǒng)更快捷高效地完成任務(wù),需要根據(jù)實(shí)際情況及需要去進(jìn)行選擇。
(江蘇省如東縣中等專業(yè)學(xué)校,江蘇 如東 226400)
參考文獻(xiàn):
[1]徐安東.visual basic 數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)教程[M].北京:清華大學(xué)出版社,2006.
[2]譚浩強(qiáng).visual basic 程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2009.
[3]greg perry.學(xué)用 visual basic 6.0[M].北京:清華大學(xué)出版社,2011.
[4]劉濤.visualbasic數(shù)據(jù)庫(kù)系統(tǒng)開(kāi)發(fā)實(shí)例[M].北京:人民郵電出版社,2003.