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

  前言:在数据库开发过程中经常需要在数据库中存储些备注信息而这些备注信息内容般较大格式多样-如有可能是语音文件、视频文件、图片文件、文本文件等怎样在PB中实现这些格式区别备注文件存取及预览直是PB开发人员比较关心个问题本文系统介绍了 3种存取备注 2进制信息思路方法 

  对备注 2进制信息存储可以采用以下 3种方式; 

  思路方法:文件保存在固定路径下数据库中存取文件路径和名称 

  思路方法 2:数据库中用blob类型或者varbinary类型字段存储备注文件 

  思路方法 3:在本地用OLE存储结构存储备注文件 

  1、OLE基本概念 

  OLE是Object Linking Embedding(对象链结和嵌入)缩写它可以使windows应用共享数据和 

  2、OLEControl控件 

  在PB中OLEControl控件是个OLE对象包容器可以使用服务器应用提供功能和命令来编辑对象也可以使用自动化OLE交互中激活对象和向服务器应用发送命令;在PB window画板中OLEControl控件允许用户从多个应用嵌入和链结组件 

  2.1建立和设置OLEControl控件 

  从window画板中选择OLEControl控件插入window 

  当建立个OLEControl控件并且插入个对象时PB将激活服务器应用以允许对对象进行编辑和修改;在使OLE中对象称为非活动状态后可以使用Control控件属性选项卡来设置Control控件属性 

  2.2 激活修改window画板中OLE对象 

  在OLEControl控件弹出菜单中选择open可以激活画板中OLE对象 

  使用服务器应用修改OLE对象 

  结束修改:使对象恢复为非活动状态只要单击服务器应用对象的外任何区域即可也可以直接关闭服务器应用窗口 

  2.3 嵌入和链结OLEControl控件 

  可以将OLE对象嵌入或者链结到自己应用嵌入对象数据放在应用在开发过程中这些数据放在应用PBl库中当生成应用后这些数据将存放在exe或PBd文件中虽然在运行过程中可以修改但修改数据不会保存;链结对象数据存放在PB应用以外当链结个对象时在PB应用中不存放数据文件而是存放引用数据指针, 使用链结数据对数据管理和保存都由服务器应用负责这样可以用服务器应用修改处理数据处理后数据可以保存回原文件中链结方式应用于需要多个应用共享数据文件任何个应用修改了数据文件都将影响到所有链结该文件应用 

  2.4 OLEControl控件激活方式 

  OLEControl控件激活方式有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() // 保存OLEControl控件 

  OLEstorage.save() //保存OLE存储 

  4、处理blob类型数据 

  对于大 2进制数据在PB Script中是用blob数据类型表示并加以处理标准SQL语句中select、insert和update语句无法直接查询blob类型数据在PB中操作blob类型数据只能用专用语句从数据库中查询blob类型数据命令是: 

  selectblob restofselectstatement {using transactionobject}; 

  更新数据库中blob类型数据格式是: 

    updateblob tablename 
   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画板中DBOLEControl控件允许用户利用这个Control控件浏览和操作数据库中大 2进制数据即通过DBOLEControl控件可以作如下操作: 

  往数据库中存储大 2进制数据如:excel工作表、word文档、视频文件、图片文件等各种格式文件; 

  ● 从数据库中检索数据到datawindow对象; 

  ● 使用OLE服务器察看修改数据; 

  ● 将修改后数据保存回数据库; 

  5.2 在数据窗口中添加blob列步骤 

  1) 选择具有 2进制字段数据表作为数据源建立数据窗口(该窗口可以至少需要包含非数据库表标识列) 

  2) 选择insert -control-OLE database blob 菜单在数据窗口detail节中要插入blob列位置单击鼠标这时将显示如图1所示对话框 

  下面解释这些属性具体含义 

  1) client : 客户类名默认为datawindow 

  2) client name:客户名默认为untitled 

  3) table: 选择含有blob列数据库表所选表字段将出现在右侧large binary/text column列表框中 

  4) large binary/text column:选择个blob类型字段列 

  5) key clause:检索和更新blob数据关键字表达式其中使用带冒号前缀变量指出是数据窗口对象如 表达式 id=:idid是数据库表中变量指出数据窗口对象列 

  6) filetemplate :如果需要OLE应用服务器每次打开相同文件则在filetemplate框中输入文件名 

  7) OLE  :如果不需要OLE应用服务器每次打开相同文件则在OLE 框中选择个OLE类如Pbrush 

  8) Client name expression:显示在OLE服务器应用窗口标题文字可以输入为:"对应记录id号是"+id 

  单击ok按钮关闭对话框将dbole列添加到适当位置保存数据窗口

  预览则可以对数据库中blob数据进行存取但是在新建记录中只能存取OLE 框中选择种格式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 = "Connect="DSN=blob"" 
  connect; 
  open(w_)


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

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

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

  4) 建立数据窗口dw_blobsave 

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

  其中:adddel,save,cancel,,retrieve等分别为数据窗口dw_blobsaveappend rowdelete rowupdateretrieve动作按钮 

  首先创建例子变量 OLEstorage stor1 

  然后如图建立窗口w_path其中数据窗口Control控件dw_1rowfocuschanged中代码如下: 

    long row_num 
  row_num=dw_1.getrow() 
   row_num >0 then 
  ole_1.insertfile(dw_1.object.s_path[row_num]) 
  end  


  其中数据窗口dw_1buttonclicked中代码如下: 

     dwo.name="cbselect" then 
  long row_num 
  row_num=dw_1.getrow() 
   filepath,filename 
  getfileopenname("请选择备注文件",filepath,filename) 
  dw_1.object.s_path[row_num]=filepath 
  ole_1.insertfile(filepath) 
  end  


  保存窗口w_path 

  6) 建立窗口w_dbblob 

  打开w_path把其另存为w_dbblob改变数据窗口dw_1rowfocuschanged中代码如下: 

    blob text1 
  long row_num 
  row_num=dw_1.getrow() 
   row_num>0 then 
   id 
  id = dw_1.object.id[row_num] 
  sqlca.autocommit=true 
  selectblob pic o :text1 from blobsave where id = :id; 
  ole_1.objectdata=text1 
  sqlca.autocommit=false 
  end  


  改变数据窗口dw_1buttonclicked中代码如下: 

    long row_num 
   dwo.name="cbselect" then 
  row_num=dw_1.getrow() 
   filepath,filename 
  getfileopenname("请选择备注文件",filepath,filename) 
  dw_1.object.s_path[row_num]=filepath 
  ole_1.insertfile(filepath) 
  end  
   dwo.name="cbsave" then 
   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 
   pic = :text1 
  where id = :id ; 
  commit; 
  sqlca.autocommit = FALSE 
  dw_1.retrieve() 
  dw_1.scrolltorow(row_num) 
  end  
  保存窗口w_dbblob 


  7) 建立窗口w_OLEblob 

  打开w_path把其另存为w_OLEblob在窗口w_OLEblobopen事件中写入以下代码: 

    stor1 = create olestorage 
  stor1.open("c:\p1.ole") //打开或创建ole文件 
  在窗口w_OLEblobclose事件中写入以下代码: 
  destroy stor1 


  改变数据窗口dw_1rowfocuschanged中代码如下: 

    blob text1 
  long row_num 
  row_num=dw_1.getrow() 
   row_num>0 then 
   id 
  id = dw_1.object.id[row_num] 
  ole_1.open(stor1,"w"+id) 
  end  


  改变数据窗口dw_1buttonclicked中代码如下: 

    long row_num 
   dwo.name="cbselect" then 
  row_num=dw_1.getrow() 
   filepath,filename 
  getfileopenname("请选择备注文件",filepath,filename) 
  dw_1.object.s_path[row_num]=filepath 
  ole_1.insertfile(filepath) 
  end  
   dwo.name="cbsave" then 
   id 
  row_num=dw_1.getrow() 
  id=dw_1.object.id[row_num] 
  ole_1.saveas(stor1,"w"+id) 
  stor1.save() 
  end  




  保存窗口w_OLEblob运行应用即可 

  7、 3种思路方法优缺点 

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

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

  思路方法 3:在本地用OLE存储结构存储备注文件可以把所有 2进制文件信息存储在个OLE存储文件中管理比较方便当 2进制文件信息存储后可以删除原来临时文件;打开存储文件后不需要每次执行服务器来显示存储信息所以存取速度较快 介绍说明:本文在PB6.5Sql anywhere数据库和PB6.5Sql Server数据库下windows98windows meNT4.0平台上试验通过



Tags:  oracleblob pboleword pbole pbblob

延伸阅读

最新评论

发表评论