6、源程序建立
1)首先在數(shù)據(jù)庫中建立如下結構的表blobsave:
字段名稱 數(shù)據(jù)類型 備注
id char(4) primairy key index
s_path char(50)
pic binary (50)
2)在PB建立PBl庫blobsave.PBl
3)在PBl庫blobsave.PBl中建立應用blobsave
在應用的open事件中設置數(shù)據(jù)庫連接程序(本程序中采用的是odbc方式連接數(shù)據(jù)庫,讀者可根據(jù)自己所建立的數(shù)據(jù)庫的不同選用不同的連接方式,以下連接數(shù)據(jù)庫的代碼也有所改動,至于連接不同的數(shù)據(jù)庫的方法,請參考有關資料,本文不做詳細介紹):
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring="DSN=blob""
connect;
open(w_main)
其中命令按鈕cb_path的clicked中的代碼格式如下:open(w_path)
其中命令按鈕cb_dbblob的clicked中的代碼格式如下:open(w_dbblob)
其中命令按鈕cb_OLEblob的clicked中的代碼格式如下:open(w_OLEblob)
4) 建立數(shù)據(jù)窗口dw_blobsave
按照上文中建立數(shù)?荽翱詰腷lob列的方法建立數(shù)據(jù)窗口dw_blobsave如圖所示:
其中:add,del,save,cancel,,retrieve等分別為數(shù)據(jù)窗口dw_blobsave的append row,delete row,update,retrieve動作按鈕。
首先創(chuàng)建實例變量 OLEstorage stor1
然后如圖建立窗口w_path,其中數(shù)據(jù)窗口控件dw_1的rowfocuschanged中的代碼如下:
long row_num
row_num=dw_1.getrow()
if row_num >0 then
ole_1.insertfile(dw_1.object.s_path[row_num])
end if
其中數(shù)據(jù)窗口dw_1的buttonclicked中的代碼如下:
if dwo.name="cbselect" then
long row_num
row_num=dw_1.getrow()
string filepath,filename
getfileopenname("請選擇備注文件",filepath,filename)
dw_1.object.s_path[row_num]=filepath
ole_1.insertfile(filepath)
end if
保存窗口w_path
6)建立窗口w_dbblob
打開w_path,把其另存為w_dbblob,改變數(shù)據(jù)窗口dw_1的rowfocuschanged中的代碼如下:
blob text1
long row_num
row_num=dw_1.getrow()
if row_num>0 then
string id
id = dw_1.object.id[row_num]
sqlca.autocommit=true
selectblob pic into :text1 from blobsave where id = :id;
ole_1.objectdata=text1
sqlca.autocommit=false
end if
改變數(shù)據(jù)窗口dw_1的buttonclicked中的代碼如下:
long row_num
if dwo.name="cbselect" then
row_num=dw_1.getrow()
string filepath,filename
getfileopenname("請選擇備注文件",filepath,filename)
dw_1.object.s_path[row_num]=filepath
ole_1.insertfile(filepath)
end if
if dwo.name="cbsave" then
string id
sqlca.autocommit = true
blob text1
text1 = ole_1.objectdata
dw_1.update()
commit;
row_num=dw_1.getrow()
id=dw_1.object.id[row_num]
updateblob blobsave
set pic = :text1
where id = :id ;
commit;
sqlca.autocommit = FALSE
dw_1.retrieve()
dw_1.scrolltorow(row_num)
end if
保存窗口w_dbblob
7)建立窗口w_OLEblob
打開w_path,把其另存為w_OLEblob,在窗口w_OLEblob的open事件中寫入以下代碼:
stor1 = create olestorage
stor1.open("c:\p1.ole") //打開或創(chuàng)建ole文件
在窗口w_OLEblob的close事件中寫入以下代碼:
destroy stor1
改變數(shù)據(jù)窗口dw_1的rowfocuschanged中的代碼如下:
blob text1
long row_num
row_num=dw_1.getrow()
if row_num>0 then
string id
id = dw_1.object.id[row_num]
ole_1.open(stor1,"w"+id)
end if
改變數(shù)據(jù)窗口dw_1的buttonclicked中的代碼如下:
long row_num
if dwo.name="cbselect" then
row_num=dw_1.getrow()
string filepath,filename
getfileopenname("請選擇備注文件",filepath,filename)
dw_1.object.s_path[row_num]=filepath
ole_1.insertfile(filepath)
end if
if dwo.name="cbsave" then
string id
row_num=dw_1.getrow()
id=dw_1.object.id[row_num]
ole_1.saveas(stor1,"w"+id)
stor1.save()
end if
保存窗口w_OLEblob,運行應用程序即可。
7、三種方法的優(yōu)缺點
方法一:文件保存在固定的路徑下,數(shù)據(jù)庫中存取文件路徑和名稱可以節(jié)省數(shù)據(jù)空間,避免了數(shù)據(jù)庫過分膨脹,但備注文件必須在一定的目錄下,不能丟失,且同一目錄下文件不能重名,對文件的管理造成一定的困難,另外,在OLE控件中瀏覽顯示備注文件時,由于每次都要調用服務器程序,所以速度較慢。
方法二:在數(shù)據(jù)庫中用blob類型或者varbinary類型字段存儲備注文件,當文件存儲在數(shù)據(jù)庫中以后,就可以刪除硬盤上原來的臨時文件,不需要復雜的二進制文件管理,且數(shù)據(jù)庫可以存儲在網(wǎng)絡服務器上,對數(shù)據(jù)的共享非常方便。
方法三:在本地用OLE存儲結構存儲備注文件?梢园阉械亩M制文件信息存儲在一個OLE存儲文件中,管理比較方便。當二進制文件信息存儲后,可以刪除原來的臨時文件;因為打開存儲文件后不需要每次執(zhí)行服務器程序來顯示存儲信息,所以存取速度較快。 說明:本文在PB6.5,Sql anywhere數(shù)據(jù)庫和PB6.5,Sql Server數(shù)據(jù)庫下,windows98,windows me,NT4.0平臺上試驗通過。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |