玩转PB的DB OLE控件
软件世界
数据库开发工具中PowerBuilder (简称PB)是一种很容易上手的开发工具,利用它的数据窗口控件可以快速地开发出相关信息管理系统。企业信息管理系统中经常用到各类报表、合同、图纸,如何快速方便地制作出相关程序和选择合适的后台数据库来存储相应大二进制数据(音频、视频、图形、图像、文档等)是开发人员经常要思索的问题。
一、什么是OLE
OLE(Object Linking and Embedding)的中文意思是“对象连接与嵌入”,是在Windows环境下实现不同Windows实用程序之间共享数据和程序功能的一种方法,是各类开发工具中不可忽视的一种编程技术。在PB的应用中实现OLE,PB作为OLE Container,在其中调用OLE Server,利用OLE Server提供的功能来显示和操纵OLE对象。通常情况下,由于大二进制数据对象没有边界,Blob类型的列不能被放置到数据窗口上,但可以通过在数据窗口中添加DB OLE对象来解决这一问题:它能够在数据库中存储OLE对象中的大二进制数据对象(比如微软Office中的Excel、Word、Powerpoint等文件),把OLE对象从数据库中提取到数据窗口,使用OLE Server(比如微软Office、Windows画笔等)来修改数据,修改后又可将修改过的数据及时存入数据库。
二、实例
下文将结合一个例子来阐述如何利用DB OLE来完成上述功能。在数据库中,建一个表,该表有一个Long Binary类型的字段,用于存放大二进制数据对象,PB可在数据窗口中提取该表的记录,并把Long Binary字段中的大二进制数据对象显示在窗口中,然后通过在数据窗中双点该处,自动打开对应的OLE Server并显示和操纵OLE对象,在修改完毕后保存修改结果到数据库。
1.建立包含相应OLE字段的数据库表
在本例中,我们就建立一个表OLE,进入PB的Database画笔来建此表。Sql语句如下:
CREATE TABLE "dba"."ole"
("mc" varchar(50) NOT NULL ,
"lx" char(1),
"wj" long binary
, PRIMARY KEY ("mc"));
注:wj字段的数据类型即为所谓Blob类型,但在不同DBMS中取的名字不同,如Sybase SQL anywhere称为Long Binary,而SQL Server为Image或Text。
2.设计数据窗口
在数据窗口画笔中,打开建好的OLE表,但此时只选择mc和lx字段进行显示,而先不要选择wj字段(过一会儿在设计窗口中再添加此字段)。数据窗口的设计窗口,从Objects菜单中选择OLE DB对象,然后在设计窗口中适当位置点鼠标左键,此时Database Blob Object对话窗显示出来。
首先在General页的Name项,填入适当名字,此项可选,但起了名字后,使你可以在程序中引用。
·在name中写入wd。
·在Definition页设置属性,主要作用见标注所示(图1)。

·──在ClientClass中填入DataWindow,可选。
·在ClientName中填入当前DataWindow的名字,可选。
·在Table中选择OLE表。
·在Large Binary/Text Columns中,选择wj字段。
·在Key Clause中,选mc=:mc,该项用于构造where子句,即where mc=:mc,用于定位相应记录。
·在File Template中,可暂时不写,在程序中用代码动态赋值。
·在OLEClass:Description(Only Class is Used)中,可暂时不写,在程序中用代码动态赋值。
·在Client Name Expression:中,填入某一字符串表达式,该表达式将OLE Server运行时,显示在其标题头处。
·按OK键。
此时,回到数据窗口的设计窗口,OLE字段以一个小方框的形式显示出来。一般情况当你运行该数据窗口时,上述小方框不显示出来。因此,为了识别该OLE字段在数据窗口中的位置,我们可将它设为边界有线条,运行时只要双击该方框,即可激活OLE Server。
3.动态调整DB OLE
当我们将相应属性选择或填写完毕后,就基本完成了利用DB OLE对象来表现数据库表的大二进制字段,但是这只是万里长征走完了第一步,如何在数据窗口中灵活快速显示编辑、存储各类不同的大二进制数据呢?这就涉及到动态改变DB OLE对象的相关属性来满足音频、视频、Office文档、扫描图形、AUTOCAD图形等大二进制数据的显示与存储、修改要求。就要在数据窗口的编程中作文章了。
首先将lx字段做些工作:
编辑该字段的Edit属性页(图2),将所要涉及的大二进制数据类型逐一输入,给定相应的Data Value值(编程中会用到)。

之后在数据窗口控件的相应过程中录入如下代码:
if lx="1"then
dw_1.object.wd.OLEClass='Imaging.Document'
dw_1.object.wd.template=''
dw_1.settransobject(SQLCA)
end if
if lx="2"then
dw_1.object.wd.OLEClass='AutoCAD.Drawing.15'
dw_1.object.wd.template=''
dw_1.settransobject(SQLCA)
end if
if lx="3"then
dw_1.object.wd.OLEClass='Word.Document.6'
dw_1.settransobject(SQLCA)
s=s+".dot" ;此处s为程序中处理的文档模板名称
if s<>''then
dw_1.object.wd.template=s
end if
end if
dw_1.retrieve()
4.预览OLE对象
程序运行中,在OLE表中添加一行,填入mc,选择相应的文件类型,然后双击方框,此时对应的OLE Server被激活。做一些修改,然后从OLE Server菜单中选择UpDate项,更新你的修改,此时OLE Server将你的修改信息送回数据窗口,关闭OLE Server并回到数据窗口,此时在你的数据窗口中OLE字段所在处显示出了OLE Server所做的工作。保存后OLE数据存入数据库中。以后,当你从库中查出OLE表中的记录时,你可以通过双点OLE对象来操作它,方法同上。
注意:
(1)此段程序在运行初期,当检索数据大于7条时,出现PB自动终止的问题,曾经怀疑是后台数据库问题,将程序移植到ORACLE8i上,问题依然存在。后又经多次试验,原来在Win9X/WinNT环境中有32KB内存使用限制,这样当查询出的相关OLE类型数据信息量较大时,在同一个数据窗口显示后滚动时程序会报系统溢出错误信息。解决办法就是在程序中用脚本控制,让DB OLE的控件中只显示选中的单条数据,问题得到圆满解决。
(2)后台数据库的管理非常重要,因为OLE类型数据信息量大,对数据库要求比较高,所以最好选择大型数据库来进行OLE类型数据的存储工作。