PB数据管道的实用程序设计技术
上一篇 /
下一篇 2009-04-22 11:22:53
/ 个人分类:PB
Powerbuilder(以下简称
pb)提供强大
数据管道技术(Data
Pipeline)。通过
数据管道,我们可以在不同
数据库表之间移动
数据,实现一个或多个表中的
数据拷贝到一个新的或已经存在的目标
数据表中。这种操作可以在同一
数据库中进行,也可以在不同
数据库,甚至可以在不同的DBMS之间进行。
我们通常使用
数据管道的两种方式:
1、直接使用
pb画板中提供的实用工具;
2、在应用程序中实现
数据移动。
本文着重结合具体实例讲述在应用程序中如何实现
数据管道技术。在应用程序中使用
数据管道有以下五个基本步骤:
1、 创建应用程序所需对象;
2、 执行
数据管道初始化操作;
3、 启动
数据管道;
4、 处理程序运行中移动
数据的错误行;
5、 执行
数据移动完毕后的收尾操作。
一、创建应用程序所需对象 为了在应用程序中实现
数据管道,需建立以下几个不同的对象:
数据管道对象;支撑用户对象;窗口对象。
创建数据管道对象。这是为实现管道功能所必须的,可在Powerbuilder提供的
pipeline画板中创建并定义它的特征。示例在
pipeline画板中创建应用程序需要的
数据管道对象pipe_user_table01. 在此着重说明Commit和Max Errors文本框中参数的意义。 1、 Commit中选中ALL,为当所有行在管道操作完成后再向
数据库提交,如果操作过程中被终止,则撤消对表的所有操作。用户可以根据实际情况加以选择自己块操作的大小。
2、 Max Errors文本框中选中NO LIMIT,为不论有多少行出错都不终止管道操作。此处视实际编程需要可选
其它数字。
创建支撑用户对象。为了提供对属性、事件及函数的支持,需创建一个继承PB管道系统对象(pipelinesystem object)的用户对象,通过这个用户对象来管理管道操作。管道系统对象包括了不同的属性、事件及函数,在程序运行时可以用来管理一个管道对象。
下表为这些属性、事件及函数。
属性 | DataObject,RowsRead,RowsWriten,RowsInError,Syntax |
事件 | PipeStart,PipeMeter,PipeEnd |
函数 | Start,Repair,Cancel |
创建过程如下:
(1)打开用户对象画板,单击New按钮,在New User Object 对话框中选择Class组框中的Standard作为用户对象类型。
(2)在Select Standard Class Type对话框中选取继承pipeline内置系统对象。
(3)声明管道监控实例。为使用户及时了解程序的运行情况,在创建支撑用户对象画板的工作区使用菜单项Declare Instance Variables中声明三个静态文本的监控实例:ist_status_read, ist_status_written, ist_status_error。编辑支撑对象的PipeMeter事件脚本,语句为:
ist_status_read.text=String(RowsRead)
ist_status_written.text=String(RowsWritten)
ist_status_error.text=String(RowsInError)
(4)保存用户对象。示例创建支撑用户对象命名为u_pipe_exchange。
示例创建窗口对象w_yz_pipeline。为了完成与管道对象进行交互和监控,该窗口应完成以下基本操作:启动管道;发生错误,显示并修复错误;终止管道操作。在创建此对象时,必须包括一个数据窗口控件,此控件为数据管道提供错误行显示。并且,由应用程序提供此控件的数据窗口对象,不必由用户指定。 下表为窗口w_yz_pipeline中窗口控件说明:
控件类型 | 控件名 | 控件说明 |
单选按钮 | Rb_create | 创建新表 |
Rb_insert | 插入到已有表 |
命令按钮 | Cb_start | 管道操作开始 |
Cb_stop | 管道操作停止 |
Cb_close | 关闭窗口 |
Cb_fixes | 修复错误行 |
Cb_cancel | 不修复错误行 |
数据窗口 | Dw_written | 写入数据信息数据窗口 |
Dw_errors | 错误信息显示数据窗口 |
静态文本 | St_status_connect | 数据库连接提示 |
St_status_read | 已读行提示 |
St_status_written | 写入行提示 |
St_status_error | 错误行提示 |
二、执行数据管道初始化操作
执行初始化操作步骤:
(1)连接管道操作的源数据库和目标数据库。
首先在窗口w_yz_pipeline声明事务对象database_source和database_destination
连接数据库脚本如下:
//连接源数据库
database_source=Create transaction
// 为database_source 对象属性赋值
。。。
//连接语句
Connect using database_source;
//判断是否成功
if database_source.SQLCode $#@60;$#@62; 0 then
beep(1)
MessagBox(“系统出错:”,“源数据库连接错误”, Exclamation!)
Halt
End if
//连接目标数据库
database_destination=Create transaction
// 为database_ destination 对象属性赋值
。。。
//连接语句
Connect using database_ destination;
if database_destination.SQLCode$#@60;$#@62;0 then
beep(1)
MessagBox(“系统出错:”,“目标数据库连接错误”, Exclamation!)
Halt
End if
(2)创建支撑用户对象实例。
//首先声明变量iuo_pipe_exchange:
u_pipe_exchange iuo_pipe_exchange
然后再在uevent_pipe_setup用户事件中创建u_pipe_exchange的实例并赋值给iuo_pipe_exchange变量:
iuo_pipe_exchange=CREATE u_pipe_exchange
(3)定义需使用的特定管道对象,即在相应事件脚本中把某一管道对象的字符串赋给支撑用户对象实例的DataObject属性值。本例中使用了两个不同的管道对象:pipe_user_table01和pipe_user_table02。Cb_start命令按钮的事件操作根据单选按钮的值来决定启动哪个管道对象进行操作,代码为:
if rb_create.checked=true then
iuo_pipe_exchange.dataobject=’pipe_user_table01’
else iuo_pipe_exchange=’pipe_user_table02’
end if
三、启动数据管道
在做好初始化工作后,就可以启动管道操作了。为了实现这一功能首先需在相应的事件脚本中写入启动程序代码,利用支撑用户对象的Start函数来启动指定的管道操作。Start函数需指明如下参数:
源数据库的事务对象;
目标数据库的事务对象;
显示错误信息的数据窗口控件;
在管道对象中定义的检索参数。缺省时,程序运行中自动让用户输入该参数值。
启动管道后,还需验证Start函数的值来判断操作成功与否。
示例脚本:
//database_source为源数据库的事务对象
//database_destination为目标数据库的事务对象
// dw_errors为显示错误信息的数据窗口控件
interger pipe_start_result
pipe_start_result=iuo_pipeline_exchange.Start(database_source,database_destination,&
dw_errors)
choose case pipe_start_result
case ?1
Beep(1)
MessageBox(“程序运行错误”,”管道打开失败”, Exclamation!)
Return
case ?3
Beep(1)
MessageBox(“程序运行错误”,”pipe_user_table01表已经存在”, Exclamation!)
Return
Case ?4
Beep(1)
MessageBox(“程序运行错误”,”pipe_user_table01表不存在”, Exclamation!)
Return
End choose
在写入数据信息窗口可以浏览管道操作成功的数据项,在此不再详细说明,用户可以参照数据窗口控件进行编程。
四、处理程序运行中移动数据的错误行
Start函数把所有的错误行都放置于dw _errors数据窗口控件中,此数据窗口控件为每一行提供了一个错误信息列。
数据窗口控件中一旦有错误行,用户可以进行修复或删除操作。注意将修复按钮和不修复按钮的enable属性赋值为true。同时,为监控程序进行的情况,在窗口w_yz_pipeline的open事件脚本中加入如下代码:
iuo_pipe_exchange.ist_status_read=St_status_read
iuo_pipe_exchange.ist_status_written=St_status_written
iuo_pipe_exchange.ist_status_error=St_status_error
修复操作调用Repair函数,然后根据函数的返回值判断修复成功与否。相关按钮Clicked事件脚本如下:
if u_pipe_exchange.repair(database_destination) $#@60;$#@62; 1 then
beep(1)
MessageBox(“修复操作:”,“程序运行错误”,Exclamation!)
Return
End if
不修复操作按钮Clicked事件脚本如下:
dw_errors.Reset()
五、执行数据移动完毕后的收尾操作
当应用程序完成管道操作后,退出应用程序时,应释放管道操作开始时获得的一些资源。窗口w_yz_pipeline的close事件脚本如下:
//清除支撑用户对象实例
DESTROY u_pipe_exchange
//关闭与源数据库的连接
DISCONNECT USING database_source
If database_source.SQLCode = -1 then
Beep(1)
MessageBox(“程序出错:”,”无法关闭源数据库”,Exclamation!)
End if
//清除源事物对象实例
DESTROY database_source
//关闭与目标数据库的连接
DISCONNECT USING database_destination;
If database_destination.SQLCode = -1 then
Beep(1)
MessageBox(“程序出错:”,”无法关闭目标数据库”,Exclamation!)
End if
//清除目标事物对象实例
DESTROY database_destination
收藏
举报
TAG:
PB
pipeline