PB数据管道的实用程序设计技术.docx
《PB数据管道的实用程序设计技术.docx》由会员分享,可在线阅读,更多相关《PB数据管道的实用程序设计技术.docx(14页珍藏版)》请在冰豆网上搜索。
![PB数据管道的实用程序设计技术.docx](https://file1.bdocx.com/fileroot1/2023-2/22/bf6ba591-087a-4021-b0dd-9ec39ef212be/bf6ba591-087a-4021-b0dd-9ec39ef212be1.gif)
PB数据管道的实用程序设计技术
PB数据管道的实用程序设计技术
Powerbuilder(以下简称pb)提供强大数据管道技术(DataPipeline)。
通过数据管道,我们可以在不同数据库表之间移动数据,实现一个或多个表中的数据拷贝到一个新的或已经存在的目标数据表中。
这种操作可以在同一数据库中进行,也可以在不同数据库,甚至可以在不同的DBMS之间进行。
我们通常使用数据管道的两种方式:
1、直接使用pb画板中提供的实用工具;
2、在应用程序中实现数据移动。
本文着重结合具体实例讲述在应用程序中如何实现数据管道技术。
在应用程序中使用数据管道有以下五个基本步骤:
1、创建应用程序所需对象;
2、执行数据管道初始化操作;
3、启动数据管道;
4、处理程序运行中移动数据的错误行;
5、执行数据移动完毕后的收尾操作。
一、创建应用程序所需对象
为了在应用程序中实现数据管道,需建立以下几个不同的对象:
数据管道对象;支撑用户对象;窗口对象。
创建数据管道对象。
这是为实现管道功能所必须的,可在Powerbuilder提供的pipeline画板中创建并定义它的特征。
示例在pipeline画板中创建应用程序需要的数据管道对象pipe_user_table01.在此着重说明Commit和MaxErrors文本框中参数的意义。
1、Commit中选中ALL,为当所有行在管道操作完成后再向数据库提交,如果操作过程中被终止,则撤消对表的所有操作。
用户可以根据实际情况加以选择自己块操作的大小。
2、MaxErrors文本框中选中NOLIMIT,为不论有多少行出错都不终止管道操作。
此处视实际编程需要可选其它数字。
创建支撑用户对象。
为了提供对属性、事件及函数的支持,需创建一个继承PB管道系统对象(pipelinesystemobject)的用户对象,通过这个用户对象来管理管道操作。
管道系统对象包括了不同的属性、事件及函数,在程序运行时可以用来管理一个管道对象。
下表为这些属性、事件及函数。
属性
DataObject,RowsRead,RowsWriten,RowsInError,Syntax
事件
PipeStart,PipeMeter,PipeEnd
函数
Start,Repair,Cancel
创建过程如下:
(1)打开用户对象画板,单击New按钮,在NewUserObject对话框中选择Class组框中的Standard作为用户对象类型。
(2)在SelectStandardClassType对话框中选取继承pipeline内置系统对象。
(3)声明管道监控实例。
为使用户及时了解程序的运行情况,在创建支撑用户对象画板的工作区使用菜单项DeclareInstanceVariables中声明三个静态文本的监控实例:
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=Createtransaction
//为database_source对象属性赋值
。
。
。
//连接语句
Connectusingdatabase_source;
//判断是否成功
ifdatabase_source.SQLCode$#@60;$#@62;0then
beep
(1)
MessagBox(“系统出错:
”,“源数据库连接错误”,Exclamation!
)
Halt
Endif
//连接目标数据库
database_destination=Createtransaction
//为database_destination对象属性赋值
。
。
。
//连接语句
Connectusingdatabase_destination;
ifdatabase_destination.SQLCode$#@60;$#@62;0then
beep
(1)
MessagBox(“系统出错:
”,“目标数据库连接错误”,Exclamation!
)
Halt
Endif
(2)创建支撑用户对象实例。
//首先声明变量iuo_pipe_exchange:
u_pipe_exchangeiuo_pipe_exchange
然后再在uevent_pipe_setup用户事件中创建u_pipe_exchange的实例并赋值给iuo_pipe_exchange变量:
iuo_pipe_exchange=CREATEu_pipe_exchange
(3)定义需使用的特定管道对象,即在相应事件脚本中把某一管道对象的字符串赋给支撑用户对象实例的DataObject属性值。
本例中使用了两个不同的管道对象:
pipe_user_table01和pipe_user_table02。
Cb_start命令按钮的事件操作根据单选按钮的值来决定启动哪个管道对象进行操作,代码为:
ifrb_create.checked=truethen
iuo_pipe_exchange.dataobject=’pipe_user_table01’
elseiuo_pipe_exchange=’pipe_user_table02’
endif
三、启动数据管道
在做好初始化工作后,就可以启动管道操作了。
为了实现这一功能首先需在相应的事件脚本中写入启动程序代码,利用支撑用户对象的Start函数来启动指定的管道操作。
Start函数需指明如下参数:
源数据库的事务对象;
目标数据库的事务对象;
显示错误信息的数据窗口控件;
在管道对象中定义的检索参数。
缺省时,程序运行中自动让用户输入该参数值。
启动管道后,还需验证Start函数的值来判断操作成功与否。
示例脚本:
//database_source为源数据库的事务对象
//database_destination为目标数据库的事务对象
//dw_errors为显示错误信息的数据窗口控件
intergerpipe_start_result
pipe_start_result=iuo_pipeline_exchange.Start(database_source,database_destination,&
dw_errors)
choosecasepipe_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
Endchoose
在写入数据信息窗口可以浏览管道操作成功的数据项,在此不再详细说明,用户可以参照数据窗口控件进行编程。
四、处理程序运行中移动数据的错误行
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事件脚本如下:
ifu_pipe_exchange.repair(database_destination)$#@60;$#@62;1then
beep
(1)
MessageBox(“修复操作:
”,“程序运行错误”,Exclamation!
)
Return
Endif
不修复操作按钮Clicked事件脚本如下:
dw_errors.Reset()
五、执行数据移动完毕后的收尾操作
当应用程序完成管道操作后,退出应用程序时,应释放管道操作开始时获得的一些资源。
窗口w_yz_pipeline的close事件脚本如下:
//清除支撑用户对象实例
DESTROYu_pipe_exchange
//关闭与源数据库的连接
DISCONNECTUSINGdatabase_source
Ifdatabase_source.SQLCode=-1then
Beep
(1)
MessageBox(“程序出错:
”,”无法关闭源数据库”,Exclamation!
)
Endif
//清除源事物对象实例
DESTROYdatabase_source
//关闭与目标数据库的连接
DISCONNECTUSINGdatabase_destination;
Ifdatabase_destination.SQLCode=-1then
Beep
(1)
MessageBox(“程序出错:
”,”无法关闭目标数据库”,Exclamation!
)
Endif
//清除目标事物对象实例
DESTROYdatabase_destination
在PowerBuilder中我们可以通过数据管道,在不同数据库表之间移动数据,实现一个或多个表中的数据拷贝到一个新的或已经存在的目标数据表中。
这种操作可以在不同数据库,甚至不同的DBMS之间进行。
PowerBuilder提供了强大的数据管道技术(DataPipeline)。
我们通常使用的有如下两种方式:
直接使用pb画板中提供的实用工具 在应用程序中实现数据移动 本文着重结合具体实例讲述在应用程序中如何实现数据管道技术。
在应用程序中使用数据管道有以下五个基本步骤:
创建应用程序所需对象; 执行数据管道初始化操作; 启动数据管道; 处理程序运行中移动数据的错误行; 执行数据移动完毕后的收尾操作。
创建应用程序所需对象 为了在应用程序中实现数据管道,需建立以下几个不同的对象:
数据管道对象、支撑用户对象、窗口对象。
创建数据管道对象这是为实现管道功能所必须的,可在Powerbuilder提供的pipeline画板中创建并定义它的特征。
示例在pipeline画板中创建应用程序需要的数据管道对象pipe_user_table01。
在此着重说明Commit和MaxErrors文本框中参数的意义。
Commit中选中ALL:
当所有行在管道操作完成后再向数据库提交,如果操作过程中被终止,则撤消对表的所有操作。
MaxErrors文本框中选中NOLIMIT:
不论有多少行出错都不终止管道操作。
此处视实际编程需要可选其它数字。
创建支撑用户对象为了提供对属性、事件及函数的支持,需创建一个继承PB管道系统对象的用户对象,通过这个用户对象来管理管道操作。
创建过程如下:
第一步,打开用户对象画板,单击New按钮,在NewUserObject对话框中选择Class组框中的Standard作为用户对象类型。
第二步,在SelectStandardClassType对话框中选取继承pipeline内置系统对象。
声明管道监控实例为使用户及时了解程序的运行情况,在创建支撑用户对象画板的工作区使用选单项DeclareInstanceVariables中声明三个静态文本的监控实例:
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) 保存用户对象示例创建支撑用户对象命名为u_pipe_exchange。
示例创建窗口对象w_yz_pipeline为了完成与管道对象进行交互和监控,该窗口应完成以下基本操作:
启动管道→发现错误→显示并修复错误→终止管道操作。
在创建此对象时,必须包括一件数据窗口控件,此控件为数据管道提供错误行显示。
并且,由应用程序提供此控件的数据窗口对象,不必由用户指定。
执行数据管道初始化操作 执行初始化操作步骤:
连接管道操作的源数据库和目标数据库:
首先在窗口w_yz_pipeline声明事务对象database_source和database_destination。
连接数据库脚本如下:
database_source=Createtransaction … Connectusingdatabase_source; ifdatabase_source.SQLCode<>0then beep
(1) MessagBox(“系统出错:
”,“源数据库连接错误”,Exclamation!
) Halt Endif database_destination=Createtransaction … Connectusingdatabase_destination; ifdatabase_destination.SQLCode<>0then beep
(1) MessagBox(“系统出错:
”,“目标数据库连接错误”,Exclamation!
) Halt Endif 创建支撑用户对象实例:
u_pipe_exchangeiuo_pipe_exchange 然后再在uevent_pipe_setup用户事件中创建u_pipe_exchange的实例并赋值给iuo_pipe_exchange变量:
iuo_pipe_exchange=CREATEu_pipe_exchange 定义需使用的特定管道对象:
即在相应事件脚本中把某一管道对象的字符串赋给支撑用户对象实例的DataObject属性值。
本例中使用了两个不同的管道对象:
pipe_user_table01和pipe_user_table02。
Cb_start命令按钮的事件操作根据单选按钮的值来决定启动哪个管道对象进行操作,代码为:
ifrb_create.checked=truethen iuo_pipe_exchange.dataobject=’pipe_user_table01’ elseiuo_pipe_exchange=’pipe_user_table02’ Endif 启动数据管道 在做好初始化工作后,就可以启动管道操作了。
为了实现这一功能首先需在相应的事件脚本中写入启动程序代码,利用支撑用户对象的Start函数来启动指定的管道操作。
Start函数需指明如下参数:
源数据库的事务对象 目标数据库的事务对象 显示错误信息的数据窗口控件 在管道对象中定义的检索参数 启动管道后,还需验证Start函数的值来判断操作成功与否。
示例脚本:
integerpipe_start_result pipe_start_result=iuo_pipeline_exchange.Start(database_source,database_destination,&& dw_errors) choosecasepipe_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 Endchoose 在写入数据信息窗口可以浏览管道操作成功的数据项,在此不再详细说明,用户可以参照数据窗口控件进行编程。
处理程序运行中移动数据的错误行 Start函数把所有的错误行都放置于dw_errors数据窗口控件中,此数据窗口控件为每一行提供了一个错误信息列。
为监控程序进行的情况,在窗口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事件脚本如下:
ifu_pipe_exchange.repair (database_destination)<>1then beep
(1) MessageBox(“修复操作:
”,“程序运行错误”,Exclamation!
) Return Endif 不修复操作按钮Clicked事件脚本如下:
dw_errors.Reset() 执行数据移动完毕后的收尾操作 当应用程序完成管道操作后,退出应用程序时,应释放管道操作开始时获得的一些资源。
窗口w_yz_pipeline的close事件脚本如下:
DESTROYu_pipe_exchange DISCONNECTUSINGdatabase_source Ifdatabase_source.SQLCode=-1then Beep
(1) MessageBox(“程序出错:
”,”无法关闭源数据库”,Exclamation!
) Endif DESTROYdatabase_source DISCONNECTUSINGdatabase_destination; Ifdatabase_destination.SQLCode=-1then Beep
(1) MessageBox(“程序出错:
”,”无法关闭目标数据库”,Exclamation!
) Endif DESTROYdatabase_destination
下面是我自己实现的一个用timer定时读pipe的例子:
w_pipetimer的open事件
///////////////////////////////////////////////////////
database_destination=createtransaction
database_destination.DBMS="MSSMicrosoftSQLServer"
database_destination.Database="moonprice"
database_destination.ServerName="wfn"
database_destination.LogPass='121'
database_destination.LogId="sa"
database_destination.AutoCommit=False
connectusingdatabase_destination;
ifdatabase_destination.sqlcode<>0then
messagebox("","1error")
endif
database_source=createtransaction
//Profileproc_unit
database_source.DBMS="MSSMicrosoftSQLServer"
database_source.Database="proc_unit"
database_source.ServerName="wfn"
database_source.LogPass='121'
database_source.LogId="sa"
database_source.AutoCommit=False
database_source.DBParm=""
connectusingdatabase_source;