pb大文本对象处理_第1页
pb大文本对象处理_第2页
pb大文本对象处理_第3页
pb大文本对象处理_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PB-大文本(Blob)对象处理 *Blob 类型的数据用来保存象大文本和图象之类的数据,这种数据长度很大、 几乎没有限制。而在 PB 中,没有长度限制的对象仅此一种类型,所以它有特殊 的处理方法。 Blob 类型的数据没有边界限制,可以保存一些普通类型的字段不能保存的信息。 以下情况下考虑使用 Blob 类型的字段: a)要保存 OLE 对象(如图形、声音等)时; b)将大型的二进制对象存入数据库中时: c)当文本对象过大,以至于一般的字符串函数无法对其操作时; d)数据库中有 PB 不能支持的数据类型时。 普通类型的字段使用数据窗口,通过调用函数 Update 和 Commit 事务管理语句 就可以保 存数据了。但 Blod 类型的数据非常庞大,所以这种类型字段的更新不能像普通 的字段,只能用其特有的语句进行更新。Updateblob 的语法格式如下: Updateblob 表名 set Blob 类型字段名 = :Blob 类型变量 where 子句; 上面的语法和 Update 语法类似,除了使用关键字 Updateblob 外,其他和 Update 语法都相同。 普通类型的字段显示是通过数据窗口,调用 Retrieve 即可。但是,由于 Blob 类型的数据非常庞大,客户端的主缓存区开辟多么大的空间都不合适。 PowerBuilder 的解决方法是,不允许在数据窗口中放置 Blob 类型的字段,而 是提供专用的提取 Blob 类型数据的语句。该语句语法如下: Selectblob Blob 类型的列名 into :Blob 类型变量 from 表名 where 子句; 上面的语法同 Select 语句类似,只是使用了关键字 Selectblob。另外, Selectblob 和 Updateblob 中的 where 子句都必须只能返回一行数据,也就是说,一次只能处 理一个 Blob 类 型的数据。 关于 Blob 类型的处理只能通过上面的两个语句来进行。不像普通类型的字段那 样数据 的更新可以通过 Insert 语句实现。所以,在使用 Updateblob 语句之前,符合 where 子句条件 的数据已经存在了,并且只存在一条数据。因此,如果想把大文本或者图像等 Blob 类型的数据写入数据库,必须首先插入这条记录的其他部分,然后再通过 修改记录的方式将 Blob 类型数据写入。 *因为大文本对象特别庞大,当使用 Updateblob 时应该将事务对象的 Autocommit 设置为 True,这很容易理解。因为这么庞大的数据量要求一次提交, 显然多大的缓冲内存都不合适,只能让事务对象在合适的时候自动提交了。 *DBMS 中的数据类型可以在 PowerScript 中与 Blob 数据类型相对应,如在 Oracle 对应为 longraw,raw。在 MS SQL Server 中对应为 image,text。在 DB2/2 中对应为 N/A。 *实例 假设在一个应用系统中,进行合同管理时要保存合同的原样,以便以后的责任 审查。用图像扫描设备将合同扫描成图形文件,以图像方式保存到数据库中, 这就涉及了 Blob 类型的处理该软件实现时,最重要的首先是图像的保存,然后 是图像的显示问题。 假设在窗口 w_contract 上左边是 dw_1,在 dw_1 上显示合同中的相关数据,用 户选择不同的数据行时,对应的合同文本显示在 picture 控件 p_1 上;用户点 击“录入合同文本”按钮时打开 w_htwb_input 窗口选择合同文本对应的图形文 件名称,返回后根据该文件大小进行相关处理,并保存到数据库中。 数据窗口 dw_1 从 contract 数据表中提取数据,该数据窗口中不包括 Blob 类型 的字段 htwb,其主键为合同编号(htbh)。当数据窗口的行焦点改变时读取该 行中的合同文本,并显示在 picture 控件 p_1 上。在数据窗口的 rowfocuschanged 事件中编写脚本如下: blob lbb_pic /用来保存图片 string ls_htbh /用来保存合同编号 if currentrow 0 then selectblob htwb into :lbb_pic from contract where htbh = :ls_htbh; /读取图象 if len(lbb_pic) 0 then p_1.setpicture(lbb_pic) else beep(2) messagebox(“提示“,ls_htbh + “号合同没有录入合同文本!“,information!) end if enf if setpointer(arrow!) 在“录入合同文本”按钮的 clicked 事件中编写脚本,弹出另外一个 response 类型的窗口 w_htwb_input,让用户在该窗口中选择要录入的合同文本的图形文 件,返回后读取该文件并保存到数据库中。因为 fileread 函数一次读取的文件 不能大于 32KB,如果大于 32KB 就只能以 32KB 为单位分多次读取。脚本如下: string ls_pic,ls_htbh integer li_i,li_fileptr,li_loops long ll_filelen,ll_bytes_read,ll_new_pos blob lbb_read,lbb_total if dw_1.modifiedcount() 32766 then li_loops = (li_filelen - 1)/32766 + 1 else li_loops = 1 end if for li_i = 1 to li_loops ll_bytes_read = fileread(li_fileptr,lbb_read) lbb_total = lbb_total + lbb_read ll_new_pos = ll_new_pos + ll_bytes_read fileseek(li_fileptr,ll_new_pos,frombeginning!) next fileclose(li_fileptr) setpicture(p_1,lbb_total) sqlca.autocommit = true updateblob contract set htwb = :lbb_total where htbh = :htbh_str; sqlca.autocommit = false if sqlca.sqlcode = -1 then messagebox(“失败“,sqlca.sqlerrtext) elseif sqlca.s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论