PowerBuilder 大文本数据的存取操作详解

时间:2022-10-14 03:35:45

PowerBuilder 大文本数据的存取操作详解

摘要:在PowerBuilder编程开发中,大文本(或大二进制)数据的存储操作具有一定的特殊性,主要体现在以下三个方面:一是大文本对象不能用一般的字符串函数进行操作,只能用PowerBuilder提供的BLOB编辑函数操作;二是由于所要操纵的文本对象过大,需要编制输出输入函数(或过程)进行预先处理;三是存储BLOB记录对事务对象有特定的要求。文章细述大文本数据操作的方法及需要注意的事项。

关键词:PowerBuilder;大文本;BLOB;数据存储

中图分类号:TP319文献标识码:A文章编号:1009-3044(2011)25-6154-02

1大文本数据的输入与保存

由于PowerBuilder每次读写操作不能超过32K字节,因此需预先编写大文本输入函数,来完成大文本的输入与输出。

函数名:F_file_input

参数:STRING FileName,BLOB lb_total_b

代码如下:

SetPointer(HOURGLASS!)

INT Li_filenum,li_loops,li_counter

LONG Ll_filelen,ll_ll_bytes_read, ll_new_pos

BLOB lb_blob_temp

Ll_filelen=FileLength(FileName) //获取文件的大小

Li_filenum=FileOpen(FileName,STREAMMODE!,READ!,LOCKREAD!) //在读取过程中设定文件为只读,其中Li_filenum为输入文件的句柄。

IFll_filelen>32766 THEN

li_loops=((ll_filelen - 1)/32766)+1

ELSE

li_loops=1

END IF//计算FileRead函数循环次数

//输入文件

FOR li_counter=1 to li_loops

ll_bytes_read=FileRead(li_filenum,lb_ blob_temp)

lb_total_b+= lb_ blob_temp

ll_new_pos+= ll_bytes_read

FileSeek(li_filenum,ll_new_pos,FROMBEGINNING!)

NEXT

FileClose(li_filenum)

Return 0

其中,参数STRING FileName为包函文件绝对路径的输入文件文件名,参数BLOB lb_total_b为生成的大文本数据。若lb_total_b是位图文件,可对其使用SetPicture函数进行图片显示,若lb_total_b是文本文件,可使用string()函数将其转成text文件。

完成数据输入后,可使用UPDATEBLOB函数对输入数据进行数据保存。UPDATEBLBO语法如下:

UPDATEBLOB TableName SET BlobColum=BlobVariable

USING SQLCA;

其中,BlobColum为数据表准备输入的大文本对象列名,该列的数据类型必须为BLOB类型,BlobVariable是PowerScript的BLOB变量,等同于上面的代码中的lb_total_b。

2 大文本数据的文件输出与打开

PowerBuilder提供SELECTBLOB语句进行BLOB输出。其使用格式与SELECT INTO语句基本相同,其语法为:

BLOB lb_blob_var

SELECTBLOB BlobColum INTO:BlobVariable FROM blob_test_table

WHERE blob_id=123

USING SQLCA;

其中,blob_test_table为包含BLOB数据的表名,BlobColum为BLOB列名,BlobVariable为PowerScript的BLOB输出变量,blob_id为该表的主键。

与大文本数据输入一样,大文本的文件输出也需要构造一个输出函数,以32K分段追加的形式进行文件输出。

函数名:F_file_output

参数:STRING FileName,BLOB lb_blob_var

代码如下:

SetPointer(HOURGLASS!)

INT Li_filenum, li_loops, li_counter

LONG ll_filelen, ll_bytes_read, ll_new_pos

BLOB read_blob

ll_filelen = Len(lb_blob_var) //获取文件的大小

li_filenum = FileOpen(FileName ,STREAMMODE!,Write!,LockWrite!,Append!)// 在输入文件的过程中指定文件为只读属性,写文件为追加模式。其中li_filenum 为输出文件的句柄。

IF ll_filelen > 32766 THEN

li_loops = ((ll_filelen - 1)/32766) + 1

ELSE

li_loops = 1

END IF //计算FileRead函数循环次数

//输出文件

FOR li_counter = 1 to li_loops

read_blob = BlobMid(lb_blob_var,1+(li_counter - 1)*32765,32765 )

FileWrite(li_filenum,read_blob)

NEXT

FileClose(li_filenum)

Return 0

其中,参数STRING FileName为包函文件绝对路径的输出文件文件名,参数BLOB lb_blob_var为需输出的大文本数据。

当完成文件需出后,可利用API函数ShellExecuteA来打开该输出文件,关于ShellExecuteA函数的构造,可参阅文献[4],这里不再赘述。

3 在数据窗口的OLE容器中显示大文本数据

在数据窗口中的OLE列存储、显示大文本数据表需满足以下条件:该表必须有主键;至少包含一个BLOB数据字段,且允许为空;全局数据库事务处理对象的AUTOCOMMIT属性须为TRUE。数据窗口OLE显示列的构造方法为:在数据窗口中选择菜单Ojbect?OLE Database Blob,在设计窗口上点击鼠标进行OLE控件布置,此时会出现OLE属性配置窗口,具体配置为:

Key Clause:指定WHERE数据检索准则,确定OLE容器的数据项,该项配置相当于使用了Select和Update语句中的WHERE子句。在程序开发中,推荐使用主键项。比如,包含BLOB字段的数据表主键为blob_id,若指定该项内容为id=:blob_id就相当于在WHERE子句中使用了...where id=:blob_id。

File Template:指定OLE对象模板。若大文本数据为DOC文件,那么就指定一个DOC文件(或者normal.dot文件)。当程序运行时,双击OLE可启动WORD应用服务器,并读取数据库中相应的数据项。

OLE Class:若未指定使用文件模板,则需要在这里指定一个应用类。

ClientNameExpression:该表达式是用以获取BLOB列中不同行的数据,使OLE可以引用不同的BLOB对象。

完成数据窗口以及相关OLE属性配置后后,即可进行预览测试OLE数据列。在预运行模式,双击OLE即可启动相关的应用服务,PowerBuilder会自动调入相应的数据项,用户可以对数据文档进行编辑。

4 需注意的几个问题

无论是在PowerScript中使用SELECTBLOB、UPDATEBLOB语句还是数据窗口的OLE容器中显示BLOB数据内容,需注意以下几个方面的问题:

1)包含BLOB字段的相关数据表必须有主键。在编程过程中,若把主键列作为WHERE条件检索(或者是OLE容器的Key Clause指定)时,该主键列必须存在,否则程序会出错。

2)BLOB数据列必须允许为空。

3)可以使用UPDATEBLOB语句修改多条记录,而SELECTBLOB语句只能检索到到一条记录。因此在使用WHERE条件语句时,应确保SELECTBLOB与查询条件相匹配。

4)使用UPDATEBLOB语句保存BLOB数据时,应确保数据库事务对象的AUTOCOMMIT属性为真(即AUTOCOMMIT=TRUE),当完成BLOB数据保存后,可恢复AUTOCOMMIT属性为FALSE状态。

5)不同的DBMS具有不同的BLOB字段名称,如:SQL Server为Image和Text,Oracle为Longraw,而SQL AnyWhere与Watcom SQL为Long Binary等等,需仔细区分。

参考文献:

[1] 吴向阳,张超群.PowerBuilder实现图片档案的数据库存取[J].医疗卫生装备,2008(10).

[2] 中国计算机世界出版服务公司.PowerBuilder应用开发系列讲座(29)[EB/OL]./147/75647.shtml.

[3] 马贵安,李明武.PowerBuilder Win32 API函数调用参考手册[M].北京:清华大学出版社,2004.

上一篇:一种手写汉字投影切分方法的改进算法 下一篇:基于方向平面特征的脱机女书识别方法研究