在PowerBuilder中操作BLOB數(shù)據(jù)的技巧
2024-07-21 02:10:00
供稿:網(wǎng)友
powerbuilder提供的blob(binary large object)數(shù)據(jù)類型可以用來處理大型數(shù)據(jù),包括圖像、大文本、word文檔、二進(jìn)制文件和多媒體等各種數(shù)據(jù),它的長度可以是0~2gb字節(jié),我們利用blob類型的變量可以將數(shù)據(jù)傳遞給數(shù)據(jù)庫以大字段方式存儲。但是用通常的數(shù)據(jù)窗口技術(shù)無法將blob類型數(shù)據(jù)加入到數(shù)據(jù)庫中,也不能將數(shù)據(jù)庫中相應(yīng)字段的數(shù)據(jù)提取出來,即使在程序中直接使用update和select等sql語句也是無法對blob類型數(shù)據(jù)進(jìn)行操作的。下面筆者將介紹在powerbuilder 7.0中操作blob類型數(shù)據(jù)的技巧。
程序設(shè)計(jì)原理
在pb中實(shí)現(xiàn)blob類型數(shù)據(jù)的入庫和查詢,主要要用到兩條特殊的sql命令--updateblob和selectblob,首先定位要進(jìn)行操作的記錄,然后使用updateblob命令就可以將blob類型變量中存放的數(shù)據(jù)傳遞給數(shù)據(jù)庫,而使用selectblob則是將指定記錄中的大字段數(shù)據(jù)傳遞給blob變量。
使用blob類型變量獲取外界文件的數(shù)據(jù)內(nèi)容,還必須借助于pb提供的可視化ole控制對象,通過它可以將指定的文件內(nèi)容顯示成相應(yīng)的對象(如bmp圖片),雙擊它就可以激活相應(yīng)的ole服務(wù)器應(yīng)用程序,來編輯修改對象的內(nèi)容,同時(shí)也可以讀取對象的數(shù)據(jù)內(nèi)容(利用ole控件的objectdata屬性),給blob類型變量賦值。
下面結(jié)合一個簡單的程序?qū)嵗v述如何處理blob數(shù)據(jù)類型。在這個例子中,bmp圖片將作為一個大字段存儲在數(shù)據(jù)庫中。我們選擇microsoft access 2000作為后臺數(shù)據(jù)庫,它的字段類型中包含“ole對象”類型(如果選擇ms sql server作為數(shù)據(jù)庫服務(wù)器,可以使用text或image類型字段存放大字段數(shù)據(jù)),這樣就為管理多媒體數(shù)據(jù)、大文件和圖片提供了支持。
操作blob字段的實(shí)現(xiàn)過程
我們在access中創(chuàng)建一個新的數(shù)據(jù)庫文件,文件名是bmp.mdb,在其中定義bmp圖片數(shù)據(jù)表bmptable如下:
各字段的其它設(shè)置(如字段寬度等),均采用缺省形式即可。
列名
字段類型
能否為空
備注
bmpno
數(shù)字
否
圖片編號(關(guān)鍵字)
bmpname
文本
能
圖片名稱
bmpdata
ole對象
能
圖片(bmp)
編程前還需要做的一步準(zhǔn)備工作是在操作系統(tǒng)的odbc配置中建立指向bmp.mdb數(shù)據(jù)庫的連接,名稱定為bmptable。
下面的程序片段實(shí)現(xiàn)了數(shù)據(jù)庫的連接,圖片的插入、更新、刪除和查詢??紤]文章的篇幅,本文只列出與主題相關(guān)的程序源碼。
1. 連接access數(shù)據(jù)庫
sqlca.dbms = "odbc"
// sqlca為全局transaction事務(wù)變量
sqlca.autocommit = false
sqlca.dbparm = "connectstring='dsn=bmptable;uid=;pwd='"
connect using sqlca;
if sqlca. sqlcode <> 0 then
messagebox ("數(shù)據(jù)庫錯誤", "連接失?。?)
halt close;
end if
2. 將bmp圖片存入數(shù)據(jù)庫
integer bmpno,icount
//變量bmpno存放給定的圖片編號
string filepath,filename
blob blb_tmp
//…此處對圖片編號bmpno賦值,例如bmpno=101;可以通過程序?qū)崿F(xiàn)為彈出對話框窗口提供一個圖片編號
//查詢指定的圖片編號是否已經(jīng)存在
icount=0
select count() into :icount
from bmptable
where bmptable.bmpno=:bmpno
using sqlca; //:bmpno為給定的圖片編號
if icount>0 then
messagebox("查詢結(jié)果",string(bmpno)+" 號圖片已經(jīng)存在,請輸入一個新的圖片編號")
return
end if
//在ole控制對象ole_1中插入bmp圖片文件
getfileopenname("請選擇一個需要插入的bmp圖片文件",filepath,filename,"bmp","bmp圖片文件(.bmp),.bmp")
if len(filepath)=0 then
return
end if
if ole_1.insertfile(filepath)<>0 then //ole錯誤
return
end if
//新圖片入庫
string sql
sql= "insert into bmptable (bmpno,bmpdata,bmpname) &&
values ("&&
+string(bmpno)+",'','"&&
+filename+"')"
execute immediate :sql;
if sqlca.sqldbcode=0 then
commit using sqlca;
//提交事務(wù)
else
messagebox("數(shù)據(jù)庫錯誤","插入失敗")
rollback using sqlca;
//事務(wù)回滾
return
end if
blb_tmp=ole_1.objectdata
updateblob bmptable set bmpdata=:blb_tmp
where bmptable.bmpno=:bmpno
using sqlca; //更新存放圖片的字段
if sqlca.sqldbcode=0 then
commit using sqlca;
//提交事務(wù)
messagebox("插入成功","圖片入庫成功")
else
messagebox("數(shù)據(jù)庫錯誤","更新圖片失敗")
rollback using sqlca;
//事務(wù)回滾
return
end if
3. 從數(shù)據(jù)庫中刪除bmp圖片
update bmptable set bmpdata=''
where bmptable.bmpno=:bmpno
using sqlca;
//bmpno為要刪除的圖片編號
if sqlca.sqldbcode=0 then
commit using sqlca;
//提交事務(wù)
else
messagebox("數(shù)據(jù)庫錯誤","更新失敗")
rollback using sqlca;
//事務(wù)回滾
return
end if
delete from bmptable
where bmptable.bmpno=:bmpno
using sqlca;
if sqlca.sqldbcode=0 then
commit using sqlca;
//提交事務(wù)
messagebox("刪除成功","圖片刪除成功")
else
messagebox("數(shù)據(jù)庫錯誤","刪除失敗")
rollback using sqlca;
//事務(wù)回滾
return
end if
4. 按圖片編號查詢圖片信息
//需要提供一個圖片編號存放在變量bmpno中
setnull(blb_tmp)
selectblob bmptable.bmpdata into :blb_tmp
from bmptable
where bmptable.bmpno=:bmpno
using sqlca;
if not isnull(blb_tmp) then
ole_1.objectdata=blb_tmp
//雙擊ole控制喚醒ole服務(wù)器即可編輯圖片
end if
使用pb編程時(shí),每次對數(shù)據(jù)庫進(jìn)行操作后要注意檢查返回結(jié)果,以保證程序的可靠性。以上程序只是對操作blob數(shù)據(jù)類型的關(guān)鍵技術(shù)進(jìn)行探討,通過畫板設(shè)計(jì)相應(yīng)的用戶界面,即可形成一個完整的基于client/server結(jié)構(gòu)的數(shù)據(jù)庫應(yīng)用程序。
注:作者沒有解決大于32k的圖片處理問題。