在PB中用OLE存取blob类型数据

本文介绍在PowerBuilder(PB)中处理BLOB类型数据的方法,包括使用OLE控件存储和预览不同格式的文件,如图片、视频等,并详细阐述了如何在PB中设置OLE控件以及使用数据窗口进行BLOB数据的存储与检索。
在PB中用OLE存取blob类型数据  
   
  华中科技大学电子与信息工程系   郭小兵    
     
   
  前言:在数据库的开发过程中,经常需要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样—如有可能是语音文件、视频文件、图片文件、文本文件等,怎样在PB中实现这些格式不同的备注文件的存取及预览,一直是PB开发人员比较关心的一个问题,本文系统的介绍了三种存取备注二进制信息的方法。  
   
  对备注二进制信息的存储可以采用以下三种方式;  
   
  方法一:文件保存在固定的路径下,数据库中存取文件路径和名称  
   
  方法二:数据库中用blob类型或者varbinary类型字段存储备注文件  
   
  方法三:在本地用OLE存储结构存储备注文件  
   
  1、OLE的基本概念  
   
  OLE是Object   Linking   Embedding(对象链结与嵌入)的缩写,它可以使windows应用程序共享数据和程序。  
   
  2、OLE控件  
   
  在PB中OLE控件是一个OLE对象的包容器,可以使用服务器应用程序提供的功能和命令来编辑对象,也可以使用自动化OLE交互,在程序中激活对象和向服务器应用程序发送命令;在PB   的window画板中的OLE控件允许用户从多个应用程序嵌入和链结组件  
   
  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.4   OLE控件的激活方式  
   
  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   设置对象  
   
  3、OLE存储  
   
  3.1   OLE存储(OLEstorage)的概念  
   
  OLE存储(OLEstorage)是OLE数据的一个仓库,存储就象磁盘上的目录结构,它可以是一个OLE对象,也可以包含在OLE对象中,每个对象都包含在OLE存储或者存储内的子存储内。保存在OLE存储中数据称作OLE流(OLE   stream),OLE流同OLE对象的关系就象文件同目录的关系。含有OLE对象的存储或子存储可以看做是属于特殊服务器的信息,在该层次之下的各部分都可以被相应的服务器程序操作。OLE存储对象是类用户对象,可以说明相应类型的变量,建立与之相应的实例和打开存储等,在使用完存储后需要关闭存储、释放分配的内存。  
   
  3.2   OLE存储的打开和保存  
   
  OLE存储可以用open函数打开,open函数的格式为:  
   
  Olecontrol.Open(OLEsourcefile),  
   
  此函数在OLEsourcefile不存在时,自动创建该文件,所以创建OLE文件也用该函数;   OLE存储可以用save函数保存,save函数的格式为:    
   
  OLEcontrol.save()   //   保存OLE控件  
   
  OLEstorage.save()   //保存OLE存储  
   
  另外,可以使用saveas函数存储OLE控件中的内容到OLE存储的存储对象中。Saveas函数的格式为:  
   
  olecontrol.SaveAs   (OLEtargetfile   )  
   
  4、处理blob类型数据  
   
  对于大二进制数据,在PB   Script中是用blob数据类型表示并加以处理。标准SQL语句中的select、insert和update语句无法直接查询blob类型的数据,在PB中操作blob类型的数据只能用专用的语句,从数据库中查询blob类型的数据的命令是:  
   
  selectblob   restofselectstatement   {using   transactionobject};  
   
  更新数据库中blob类型数据的格式是:  
   
  updateblob   tablename    
   
  set   blobcolumn   =   blobvarible  
   
  restofupatestatement   {using   transctionobject};  
   
  如连接的数据库是sybase或者Sql,则selectblob和updateblob语句要求数据库的自动提交方式为true,所以在在每次调用selectblob和updateblob语句以前必须用命令   Sqlca.autocommit=true,把数据库的自动提交方式设置为true,在updateblob语句的结束后,再用命令Sqlca.autocommit   =   false,把自动提交方式设置为false。  
   
  5、数据窗口的blob列  
   
  5.1   数据窗口blob列的功能  
   
  在PB   的datawindow画板中DBOLE控件允许用户利用这个控件浏览和操作数据库中的大二进制数据,即通过DBOLE控件可以作如下操作:  
   
  ²往数据库中存储大二进制数据,如:excel工作表、word文档、视频文件、图片文件等各种格式的文件;  
   
  ●   从数据库中检索数据到datawindow对象;  
   
  ●   使用OLE服务器程序察看修改数据;  
   
  ●   将修改后的数据保存回数据库;  
   
  5.2   在数据窗口中添加blob列的的步骤  
   
  1)   选择具有二进制字段的数据表作为数据源建立一新的数据窗口(该窗口可以至少需要包含非数据库表的标识列)  
   
  2)   选择insert   –control-OLE   database   blob   菜单,在数据窗口的detail节中要插入blob列的位置单击鼠标,这时将显示如图1所示的对话框  
   
  下面解释这些属性的具体含义  
   
  1)   client   class:   客户类名,默认为datawindow  
   
  2)   client   name:客户名,默认为untitled  
   
  3)   table:   选择含有blob列的数据库表,所选表的字段将出现在右侧的large   binary/text   column列表框中。  
   
  4)   large   binary/text   column:选择一个blob类型的字段列  
   
  5)   key   clause:检索和更新blob数据的关键字表达式其中使用带冒号前缀的变量指出是数据窗口对象的列,如   表达式   id=:id,id是数据库表中的列,变量指出数据窗口对象的列  
   
  6)   filetemplate   :如果需要OLE应用服务器每次打开相同的文件,则在filetemplate框中输入文件名。  
   
  7)   OLE   class   :如果不需要OLE应用服务器每次打开相同的文件,则在OLE   class框中选择一个OLE类,如Pbrush。  
   
  8)   Client   name   expression:显示在OLE服务器应用程序窗口标题的文字,可以输入为:“对应记录的id号是”+id  
   
   
     
   
  图1   defination属性框  
   
  单击ok按钮关闭对话框,将dbole列添加到适当的位置,保存数据窗口。  
   
  预览则可以对数据库中的blob数据进行存取,但是在新建的记录中只能存取OLE   class框中选择的一种格式的blob数据,不能存储多种格式的数据;但如果数据库中存有多种格式的数据,可以预览各种格式的数据。  
  6、源程序建立  
  1)   首先在数据库中建立如下结构的表blobsave:  
  字段名称   数据类型   备注  
  id   char(4)   primairy   key   index  
  s_path   char(50)    
  pic   binary   (50)    
  2)   在PB建立PBl库blobsave.PBl  
  3)   在PBl库blobsave.PBl中建立应用blobsave  
  在应用的open事件中设置数据库连接程序(本程序中采用的是odbc方式连接数据库,读者可根据自己所建立的数据库的不同选用不同的连接方式,以下连接数据库的代码也有所改动,至于连接不同的数据库的方法,请参考有关资料,本文不做详细介绍):  
  SQLCA.DBMS   =   "ODBC"  
  SQLCA.AutoCommit   =   False  
  SQLCA.DBParm   =   "Connectstring='DSN=blob'"  
  connect;  
  open(w_main)    
  w_main是为应用程序建立的主窗口,如图所示:  
     
  图2   出口w_main  
  其中命令按钮cb_path的clicked中的代码格式如下:open(w_path)  
  其中命令按钮cb_dbblob的clicked中的代码格式如下:open(w_dbblob)  
  其中命令按钮cb_OLEblob的clicked中的代码格式如下:open(w_OLEblob)  
  4)   建立数据窗口dw_blobsave  
  按照上文中建立数据窗口的blob列的方法建立数据窗口dw_blobsave如图所示:  
  其中:add,del,save,cancel,,retrieve等分别为数据窗口dw_blobsave的append   row,delete   row,update,retrieve动作按钮。  
     
  图3   数据窗口dw_blobsave  
  5)   新建窗口w_path,如图4所示:  
     
  图4   窗口w_path  
  首先创建实例变量   OLEstorage   stor1  
  然后如图建立窗口w_path,其中数据窗口控件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  
  其中数据窗口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,改变数据窗口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  
  改变数据窗口dw_1的buttonclicked中的代码如下:  
  long   row_num  
  if   dwo.name="cbselec 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值