前言:在数据库的开发过程中,经常需要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样-如有可能是语音文件、视频文件、图片文件、文本文件等,怎样在PB中实现这些格式不同的备注文件的存取及预览,一直是PB开发人员比较关心的一个问题,本文系统的介绍了三种存取备注二进制信息的方法。
对备注二进制信息的存储可以采用以下三种方式;
方法一:文件保存在固定的路径下,数据库中存取文件路径和名称
方法二:数据库中用blob类型或者varbinary类型字段存储备注文件
方法三:在本地用OLE存储结构存储备注文件
1、OLE的基本概念
OLE是ObjectLinkingEmbedding(对象链结与嵌入)的缩写,它可以使windows应用程序共享数据和程序。
2、OLE控件
在PB中OLE控件是一个OLE对象的包容器,可以使用服务器应用程序提供的功能和命令来编辑对象,也可以使用自动化OLE交互,在程序中激活对象和向服务器应用程序发送命令;在PB的window画板中的OLE控件允许用户从多个应用程序嵌入和链结组件
财管家园.fs119.net
2.1建立和设置OLE控件
从window画板中选择OLE控件插入window。
当建立一个OLE控件并且插入一个对象时,PB将激活服务器应用程序以允许对对象进行编辑和修改;在使OLE中的对象称为非活动状态后,可以使用控件属性选项卡来设置控件的属性。
2.2激活修改window画板中的OLE对象
在OLE控件的弹出菜单中选择open可以激活画板中OLE对象
使用服务器应用程序修改OLE对象
结束修改:使对象恢复为非活动状态,只要单击服务器应用对象之外的任何区域即可,也可以直接关闭服务器应用程序的窗口。
2.3嵌入和链结OLE控件
可以将OLE对象嵌入或者链结到自己的应用程序中。嵌入对象的数据放在应用程序中,在开发过程中这些数据放在应用程序的PBl库中,当生成应用后,这些数据将存放在exe或PBd文件中,虽然在程序的运行过程中可以修改,但修改的数据不会保存;链结对象的数据存放在PB应用程序以外,当链结一个对象时,在PB应用程序中不存放数据文件,而是存放引用数据的指针,使用链结的数据,对数据的管理和保存都由服务器应用程序负责。这样可以用服务器应用程序修改处理数据,处理后的数据可以保存回原文件中。链结方式应用于需要多个应用程序共享的数据文件,任何一个应用程序修改了数据文件,都将影响到所有链结该文件的应用程序。
2.4OLE控件的激活方式
OLE控件的激活方式有offsite和in-place两种激活方式,offsite激活方式是指在PB应用程序的界面以外单独打开OLE对象,in-place激活方式是指PB应用程序的界面的原位置打开OLE对象。在数据窗口中的dbOLE默认的是offsite激活方式,而window中的OLE默认的激活方式是in-place。
在PB应用程序中可以用命令
OLE_control.active(offsite)或者OLE_control.active(in-place)设置OLE对象的以何种方式打开。
2.5设置和插入OLE对象
在程序运行时可以用函数:
OLE_control.insertfile(soucefile)插入对象
OLE_control.objectdata=blobvar设置对象
财.软联盟.fs119.net
财管,家园,fs119.net
财管家园,fs119.net
财管家园.fs119.net
3、OLE存储
3.1OLE存储(OLEstorage)的概念
OLE存储(OLEstorage)是OLE数据的一个仓库,存储就象磁盘上的目录结构,它可以是一个OLE对象,也可以包含在OLE对象中,每个对象都包含在OLE存储或者存储内的子存储内。保存在OLE存储中数据称作OLE流(OLEstream),OLE流同OLE对象的关系就象文件同目录的关系。含有OLE对象的存储或子存储可以看做是属于特殊服务器的信息,在该层次之下的各部分都可以被相应的服务器程序操作。OLE存储对象是类用户对象,可以说明相应类型的变量,建立与之相应的实例和打开存储等,在使用完存储后需要关闭存储、释放分配的内存。
3.2OLE存储的打开和保存
OLE存储可以用open函数打开,open函数的格式为:
Olecontrol.Open(OLEsourcefile),
此函数在OLEsourcefile不存在时,自动创建该文件,所以创建OLE文件也用该函数;OLE存储可以用save函数保存,save函数的格式为:
OLEcontrol.save()//保存OLE控件
OLEstorage.save()//保存OLE存储
4、处理blob类型数据
对于大二进制数据,在PBScript中是用blob数据类型表示并加以处理。标准SQL语句中的select、insert和update语句无法直接查询blob类型的数据,在PB中操作blob类型的数据只能用专用的语句,从数据库中查询blob类型的数据的命令是:
selectblobrestofselectstatement{usingtransactionobject};
更新数据库中blob类型数据的格式是:
setblobcolumn=blobvarible
restofupatestatement{usingtransctionobject};
财,管家园,fs119.net
如连接的数据库是sybase或者Sql,则selectblob和updateblob语句要求数据库的自动提交方式为true,所以在在每次调用selectblob和updateblob语句以前必须用命令Sqlca.autocommit=true,把数据库的自动提交方式设置为true,在updateblob语句的结束后,再用命令Sqlca.autocommit=false,把自动提交方式设置为false。索数据的参数(如flag),然后在可修改列的Protect后的框中输入(user_name是该DataWindow中的一列,代表输入者的名称):
5、数据窗口的blob列
5.1数据窗口blob列的功能
在PB的datawindow画板中DBOLE控件允许用户利用这个控件浏览和操作数据库中的大二进制数据,即通过DBOLE控件可以作如下操作:
往数据库中存储大二进制数据,如:excel工作表、word文档、视频文件、图片文件等各种格式的文件;
●从数据库中检索数据到datawindow对象;
●使用OLE服务器程序察看修改数据;
●将修改后的数据保存回数据库;
5.2在数据窗口中添加blob列的的步骤
1)选择具有二进制字段的数据表作为数据源建立一新的数据窗口(该窗口可以至少需要包含非数据库表的标识列)
2)选择insert-control-OLEdatabaseblob菜单,在数据窗口的detail节中要插入blob列的位置单击鼠标,这时将显示如图1所示的对话框
下面解释这些属性的具体含义
1)clientclass:客户类名,默认为datawindow
2)clientname:客户名,默认为untitled
3)table:选择含有blob列的数据库表,所选表的字段将出现在右侧的largebinary/textcolumn列表框中。
4)largebinary/textcolumn:选择一个blob类型的字段列
5)keyclause:检索和更新blob数据的关键字表达式其中使用带冒号前缀的变量指出是数据窗口对象的列,如表达式id=:id,id是数据库表中的列,变量指出数据窗口对象的列
财管家园 fs119.net
6)filetemplate:如果需要OLE应用服务器每次打开相同的文件,则在filetemplate框中输入文件名。
7)OLEclass:如果不需要OLE应用服务器每次打开相同的文件,则在OLEclass框中选择一个OLE类,如Pbrush。
8)Clientnameexpression:显示在OLE服务器应用程序窗口标题的文字,可以输入为:"对应记录的id号是"id
单击ok按钮关闭对话框,将dbole列添加到适当的位置,保存数据窗口。
预览则可以对数据库中的blob数据进行存取,但是在新建的记录中只能存取OLEclass框中选择的一种格式的blob数据,不能存储多种格式的数据;但如果数据库中存有多种格式的数据,可以预览各种格式的数据。
6、源程序建立
1)首先在数据库中建立如下结构的表blobsave:
字段名称数据类型备注
idchar(4)primairykeyindex
财.管家园.fs119.net
s_pathchar(50)
picbinary(50)
2)在PB建立PBl库blobsave.PBl
3)在PBl库blobsave.PBl中建立应用blobsave
在应用的open事件中设置数据库连接程序(本程序中采用的是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)
财软,联盟,fs119.net
4)建立数据窗口dw_blobsave
按照上文中建立数?荽翱诘腷lob列的方法建立数据窗口dw_blobsave如图所示:
其中:add,del,save,cancel,,retrieve等分别为数据窗口dw_blobsave的appendrow,deleterow,update,retrieve动作按钮。
首先创建实例变量OLEstoragestor1
然后如图建立窗口w_path,其中数据窗口控件dw_1的rowfocuschanged中的代码如下:
row_num=dw_1.getrow()
ifrow_num>0then
ole_1.insertfile(dw_1.object.s_path[row_num])
endif
其中数据窗口dw_1的buttonclicked中的代码如下: 保存窗口w_path 改变数据窗口dw_1的buttonclicked中的代码如下: 财软联盟,fs119.net 7)建立窗口w_OLEblob 改变数据窗口dw_1的rowfocuschanged中的代码如下: 改变数据窗口dw_1的buttonclicked中的代码如下: 财软联.盟.fs119.net 保存窗口w_OLEblob,运行应用程序即可。 财管家园.fs119.net 财软联盟.fs119.net 财软联盟 fs119.net 财管 家园 fs119.net
ifdwo.name="cbselect"then
longrow_num
row_num=dw_1.getrow() 财管家,园,fs119.net
stringfilepath,filename
getfileopenname("请选择备注文件",filepath,filename)
dw_1.object.s_path[row_num]=filepath
ole_1.insertfile(filepath)
endif
6)建立窗口w_dbblob
打开w_path,把其另存为w_dbblob,改变数据窗口dw_1的rowfocuschanged中的代码如下:
blobtext1
longrow_num
row_num=dw_1.getrow()
ifrow_num>0then
stringid
id=dw_1.object.id[row_num]
sqlca.autocommit=true
selectblobpicinto:text1fromblobsavewhereid=:id;
ole_1.objectdata=text1
sqlca.autocommit=false
endif
longrow_num
ifdwo.name="cbselect"then
row_num=dw_1.getrow()
stringfilepath,filename
getfileopenname("请选择备注文件",filepath,filename)
dw_1.object.s_path[row_num]=filepath
ole_1.insertfile(filepath)
endif
ifdwo.name="cbsave"then
stringid
sqlca.autocommit=true
blobtext1
text1=ole_1.objectdata
dw_1.update()
commit;
row_num=dw_1.getrow()
id=dw_1.object.id[row_num]
updateblobblobsave
setpic=:text1
whereid=:id;
commit;
sqlca.autocommit=FALSE
dw_1.retrieve()
dw_1.scrolltorow(row_num)
endif
保存窗口w_dbblob
打开w_path,把其另存为w_OLEblob,在窗口w_OLEblob的open事件中写入以下代码: 财管家园 fs119.net
stor1=createolestorage
stor1.open("c:\p1.ole")//打开或创建ole文件
在窗口w_OLEblob的close事件中写入以下代码:
destroystor1
blobtext1
longrow_num
row_num=dw_1.getrow()
ifrow_num>0then
stringid
id=dw_1.object.id[row_num]
ole_1.open(stor1,"w"id)
endif
longrow_num
ifdwo.name="cbselect"then
row_num=dw_1.getrow()
stringfilepath,filename
getfileopenname("请选择备注文件",filepath,filename)
dw_1.object.s_path[row_num]=filepath
ole_1.insertfile(filepath)
endif
ifdwo.name="cbsave"then
stringid
row_num=dw_1.getrow()
id=dw_1.object.id[row_num]
ole_1.saveas(stor1,"w"id)
stor1.save()
endif
7、三种方法的优缺点
方法一:文件保存在固定的路径下,数据库中存取文件路径和名称可以节省数据空间,避免了数据库过分膨胀,但备注文件必须在一定的目录下,不能丢失,且同一目录下文件不能重名,对文件的管理造成一定的困难,另外,在OLE控件中浏览显示备注文件时,由于每次都要调用服务器程序,所以速度较慢。
方法二:在数据库中用blob类型或者varbinary类型字段存储备注文件,当文件存储在数据库中以后,就可以删除硬盘上原来的临时文件,不需要复杂的二进制文件管理,且数据库可以存储在网络服务器上,对数据的共享非常方便。
方法三:在本地用OLE存储结构存储备注文件。可以把所有的二进制文件信息存储在一个OLE存储文件中,管理比较方便。当二进制文件信息存储后,可以删除原来的临时文件;因为打开存储文件后不需要每次执行服务器程序来显示存储信息,所以存取速度较快。说明:本文在PB6.5,Sqlanywhere数据库和PB6.5,SqlServer数据库下,windows98,windowsme,NT4.0平台上试验通过。
Google.cn搜索相关文章:
谷歌中搜索全球网 在PB中用OLE存取blob类型数据
百度中搜索 在PB中用OLE存取blob类型数据
谷歌中搜索www.fs119.net 在PB中用OLE存取blob类型数据
下一篇:PowerBuilder实用技巧八则