摘要:闡述了大對象數(shù)據(jù)類型在Oracle數(shù)據(jù)庫的實現(xiàn)方式,探討了用PB存取Oracle數(shù)據(jù)庫中圖片資料的方式,并給出了社會保險管理信息系統(tǒng)中圖片資料保存和顯示的程序代碼,強調(diào)了程序代碼的關(guān)鍵點。
關(guān)鍵詞:圖片;信息系統(tǒng);存??;PowerBuilder;Oracle
中圖分類號:TP319 文獻標識碼:A 文章編號:1007-9599 (2012) 15-0000-02
1 引言
在開發(fā)管理信息系統(tǒng)時,經(jīng)常會涉及圖片處理,例如:需要處理員工照片,需要處理掃描后的檔案資料等。在基于C/S結(jié)構(gòu)開發(fā)的Oracle數(shù)據(jù)庫系統(tǒng)中,圖片存取的方式主要有三種。第一種:圖片文件保存在固定的路徑下,數(shù)據(jù)庫中只保存取文件路徑和名稱,優(yōu)點是可以節(jié)省磁盤空間,缺點是圖片文件必須在固定的目錄下,不能丟失損壞,且同一目錄下文件不能重名,圖片文件比較零散,管理不便;第二種:在Oracle數(shù)據(jù)庫中用blob類型字段保存圖片文件,數(shù)據(jù)庫若存放在網(wǎng)絡(luò)服務(wù)器上,用戶對數(shù)據(jù)的共享訪問方便;第三種:在本地用OLE存儲結(jié)構(gòu)存儲備注文件。
我們在開發(fā)本企業(yè)的社會保險管理信息系統(tǒng)時,使用PowerBuilder作為前臺開發(fā)工具,Oracle作為后臺數(shù)據(jù)庫管理平臺,采用C/S結(jié)構(gòu),Oracle數(shù)據(jù)庫中用blob類型字段保存圖片文件的方式,成功實現(xiàn)了圖片資料的處理功能。社會保險管理信息系統(tǒng)中記錄參保人員的基本信息,這些信息都對應(yīng)圖片。所以,在Oracle數(shù)據(jù)庫中建立表qa04,用來存儲圖片資料。表Qa04包含字段sfzhm(參保人員的身份證號碼),類型是CHAR,是表的主鍵,tpzl(存儲參保人員檔案圖片),類型是BLOB,其它字段(略)等。該表可以用PB在前臺直接創(chuàng)建,也可以用CREAT命令在后臺創(chuàng)建。
2 PB和ORACLE數(shù)據(jù)庫的連接
PB是美國Sybase公司研制的基于Windows的一個集成化開發(fā)工具。它包含一個直觀的圖形界面和可擴展的面向?qū)ο蟮木幊陶Z言PowerScript,提供與當前流行的大型數(shù)據(jù)庫的接口,并可以通過ODBC與數(shù)據(jù)庫相連。
ORACLE數(shù)據(jù)庫系統(tǒng)是美國ORACLE公司(甲骨文)提供的以分布式數(shù)據(jù)庫為核心的一組軟件產(chǎn)品,是目前最流行的客戶/服務(wù)器(CLIENT/SERVER)或B/S體系結(jié)構(gòu)的數(shù)據(jù)庫之一。作為一個關(guān)系數(shù)據(jù)庫,它是一個完備關(guān)系的產(chǎn)品;作為分布式數(shù)據(jù)庫它實現(xiàn)了分布式處理功能。我們開發(fā)的社會保險軟件,考慮到數(shù)據(jù)量大,并發(fā)操作比較多,實時性要求高,所以采用了ORACLE數(shù)據(jù)庫。
PB在訪問數(shù)據(jù)庫之前,必須首先要與Oracle數(shù)據(jù)庫建立連接關(guān)系。PB與Oracle數(shù)據(jù)庫的連接通過數(shù)據(jù)庫接口來實現(xiàn),Power Builder提供了兩類接口:ODBC接口和專用接口。Oracle專用接口針對Oracle數(shù)據(jù)庫管理系統(tǒng)而設(shè)計,針對自身的特點.能夠充分發(fā)揮Oracle數(shù)據(jù)庫的優(yōu)勢,因此應(yīng)該選用專用接口進行連接。我們在開發(fā)本企業(yè)的社會保險管理信息系統(tǒng)時,是將連接參數(shù)寫到配置文件當中,然后在PB腳本中從配置文件中讀取文件,參數(shù)文件內(nèi)容如下:
[Database]
DBMS=O84 Oracle8/8i (8.x.4+)
logId=[用戶名稱] ;logpass=[密碼];servername=[服務(wù)器名稱];database=[數(shù)據(jù)庫密碼];userid=[數(shù)據(jù)庫名稱];databasepassword=[Oracle服務(wù)器密碼];
DBParm=PBCatalogOwner='ldrs',DisableBind=1,SvrFailover='Yes'
program=參保人員管理系統(tǒng);version=1.0;copytime=2011.10.1
3 Oracle數(shù)據(jù)庫中大對象數(shù)據(jù)類型
在Oracle數(shù)據(jù)庫中主要有四種大對象數(shù)據(jù)類型:第一種是BLOB數(shù)據(jù)類型。用來存儲可變長度的二進制數(shù)據(jù)。由于其存儲的是通用的二進制數(shù)據(jù),因此在數(shù)據(jù)庫之間或者在客戶端與服務(wù)器之間進行傳輸?shù)臅r候,不需要進行字符集的轉(zhuǎn)換,其傳輸?shù)男时容^高,且不容易出現(xiàn)亂碼現(xiàn)象。第二種是CLOB數(shù)據(jù)類型。是用來存儲可變長度的字符型數(shù)據(jù),其存儲的最大數(shù)據(jù)量是4GB。而且在定義這個數(shù)據(jù)類型的時候,不需要指定最大的固定長度,這樣就可以節(jié)省空間。第三種是NCLOB數(shù)據(jù)類型。這個數(shù)據(jù)類型跟CLOB數(shù)據(jù)類型相似,也是用來存儲字符類型的數(shù)據(jù),但它其存儲的是Unicode字符集字符數(shù)據(jù)。第四種是BFILE數(shù)據(jù)類型。它是在數(shù)據(jù)庫外面存儲的可變二進制數(shù)據(jù),其最多也可以存儲4GB的數(shù)據(jù)。這個數(shù)據(jù)類型的特殊在于其在數(shù)據(jù)庫之外存儲實際數(shù)據(jù)。也就是說,跟其他大對象數(shù)據(jù)類型不同,其數(shù)據(jù)并不是存儲在數(shù)據(jù)文件中,而是獨立于數(shù)據(jù)文件而存在的。在這個字段中,其只存儲了指針信息。
4 PB處理大對象數(shù)據(jù)類型
對于大二進制數(shù)據(jù),在PB Script中是用blob數(shù)據(jù)類型表示并加以處理。標準SQL語句中的select、insert和update語句無法直接查詢blob類型的數(shù)據(jù),在PB中操作blob類型的數(shù)據(jù)只能用專用的語句,從數(shù)據(jù)庫中查詢blob類型的數(shù)據(jù)的命令是:
selectblob restofselectstatement {using transactionobject};
更新數(shù)據(jù)庫中blob類型數(shù)據(jù)的格式是:
updateblob tablename
set blobcolumn=blobvarible
restofupatestatement {using transctionobject};
5 將資料圖片文件保存到數(shù)據(jù)庫方法
社會保險管理信息資料圖片錄入界面具有二個功能按鈕,一個是“預(yù)覽圖片”,另一個是“保存圖片”。
“預(yù)覽圖片”主要完成判斷是否是圖形文件,如文件后綴是“.BMP”、“.JPG”等都是圖形文件;其次還要檢驗文件是否超過限定大小,在本例中文件限定為128KB,這樣可以為數(shù)據(jù)庫節(jié)約空間;最后因PB每次只能處理32KB的二進制信息,所以要利用循環(huán)語句將大圖片分塊讀取。
“保存圖片”主要用UPDATEBLOB語句,將圖片文件存入數(shù)據(jù)庫,語句格式如下,詳細代碼略。
UPDATEBLOB qa04 SET tpzl=:pict_data where sfzhm=:p_a_sfzhm
6 顯示數(shù)據(jù)庫中的資料圖片
圖6.1 圖6.2
顯示數(shù)據(jù)庫中的資料圖片界面如圖6.1,要顯示某一行信息的對應(yīng)圖片,只需雙擊該行信息。信息顯示效果如圖6.2。顯示數(shù)據(jù)庫中的資料圖片主要用SELECTBLOB語句,具體代碼如下:
integer fr_len;string pc_id;blob pictdata;long fp;string zlfl
//zlfl 變量--資料分類
this.setcolumn(3);zlfl=this.gettext();zlfl=trim(zlfl)
SELECTBLOB tpzl INTO :pictdata FROM qa04 where sfzhm=:p_a_sfzhm and gzdw=:zlfl;
int m_ln;m_ln = len(pictdata);
IF SQLCA.SQLCode = 0 and m_ln <>0 THEN
p_1.setpicture(pictdata)
p_1.show()
ELSE
MessageBox (\"錯誤提示\",\"圖片讀取失??!\")
p_1.hide()
END IF
7 結(jié)論
社會保險管理信息系統(tǒng)中圖片資料的最佳存儲方式是用Oracle數(shù)據(jù)庫中的BLOB數(shù)據(jù)類型,它不需要進行字符集的轉(zhuǎn)換,傳輸?shù)男室脖容^高,且不容易出現(xiàn)亂碼現(xiàn)象,便于在客戶端與服務(wù)器之間進行數(shù)據(jù)傳輸。用PB對數(shù)據(jù)庫中的圖片資料進行存取,不能直接用標準的SQL語句,必須用專用的UPDATEBLOB和SELECTBLOB命令
參考文獻:
[1]李勁.對PB訪問數(shù)據(jù)庫中大對象數(shù)據(jù)方法的研究[J].微計算機信息,2006,22:236-238
[2]何旭洪,趙吳彤,歐陽軍.Oracle8+PowerBuilder7數(shù)據(jù)庫應(yīng)用開發(fā)[M].北京:人民郵電出版社,2001
[3]李玉東,馬琳.PowerBuilder8.0控件與對象大全[M].北京:電子工業(yè)出版社,2002
[作者簡介]高翔云(1970-),女,遼寧沈陽人,工程師,主要從事通信計費系統(tǒng)開發(fā)與維護。