AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > PowerBuilder

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

51自学网 http://www.51zixue.net

  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存储 

  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。 索数据的参数(如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-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 

  单击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)

  其中命令按钮cb_path的clicked中的代码格式如下:open(w_path) 

  其中命令按钮cb_dbblob的clicked中的代码格式如下:open(w_dbblob) 

  其中命令按钮cb_OLEblob的clicked中的代码格式如下:open(w_OLEblob) 

  4) 建立数据窗口dw_blobsave 

  按照上文中建立数?荽翱诘腷lob列的方法建立数据窗口dw_blobsave如图所示: 

  其中:add,del,save,cancel,,retrieve等分别为数据窗口dw_blobsave的append row,delete row,update,retrieve动作按钮。 

  首先创建实例变量 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="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") //打开或创建ole文件 

  在窗口w_OLEblob的close事件中写入以下代码: 

  destroy stor1 

  改变数据窗口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 

  改变数据窗口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、三种方法的优缺点 

  方法一:文件保存在固定的路径下,数据库中存取文件路径和名称可以节省数据空间,避免了数据库过分膨胀,但备注文件必须在一定的目录下,不能丢失,且同一目录下文件不能重名,对文件的管理造成一定的困难,另外,在OLE控件中浏览显示备注文件时,由于每次都要调用服务器程序,所以速度较慢。 

  方法二:在数据库中用blob类型或者varbinary类型字段存储备注文件,当文件存储在数据库中以后,就可以删除硬盘上原来的临时文件,不需要复杂的二进制文件管理,且数据库可以存储在网络服务器上,对数据的共享非常方便。 

  方法三:在本地用OLE存储结构存储备注文件。可以把所有的二进制文件信息存储在一个OLE存储文件中,管理比较方便。当二进制文件信息存储后,可以删除原来的临时文件;因为打开存储文件后不需要每次执行服务器程序来显示存储信息,所以存取速度较快。 说明:本文在PB6.5,Sql anywhere数据库和PB6.5,Sql Server数据库下,windows98,windows me,NT4.0平台上试验通过。

 
 

上一篇:深入了解PowerBuilder的数据窗口  下一篇:PB环境下分布式应用程序的开发