一、实现方法数据库
经过应用程序实现数据的自动迁移,要求被操做的源和目标数据库已经存在,而且数据迁移的策略(数据管道)也应创建。在此基础上,经过应用程序使用数据管道,实现数据的自动迁移。app
2.1实现步骤函数
通常说来,在应用程序中使用数据管道有五个基本步骤:ui
(1)建立对象 建立数据管道对象、管道对象的支撑用户对象和一个窗口对象。spa
(2)初始化操做 建立两个事务对象的实例,分别链接源和目的数据库;建立管道对象的支撑用户对象的一个实例,并初始化为已经创建的数据管道对象。对象
(3)启动数据管道 经过支撑用户对象的实例启动数据管道事件
(4)处理错误 对管道操做中出错的数据行能够进行修复和放弃。事务
(5)结束操做 断开数据库的链接,并释放用过的实例,关闭窗口。ip
2.2建立对象ci
2.2.1建立数据管道对象
使用数据管道实现数据的迁移,无论是在PowerBuild环境中以交互方式进行仍是使用应用程序进行,首先必须创建数据管道。
创建数据管道应该在PowerBuild环境中进行。
1) 配置两个ODBC数据源,这里假设它们是S和D,其中,S链接源数据库,D链接目标数据库。
2) 经过“New→Database→Pipeline”定义管道对象。在定义过程当中,数据源若是是数据表,则“Data Source”选“Quick Select”/“SQL Select”,若是是存储过程,则选“Stored Procedure”;“Source Connection”选S,“Destination Connection”选D;选定源链接中的数据表,根据须要选定字段,并设置数据行的筛选条件;设定目标表的名称,管道操做的类型;存盘。
管道操做的类型有建立、替换、刷新、增长或修改几种,根据须要选择其中一种。正常状况下,若是进行数据备份,应定义两个相关的管道对象,这两个 管道对象只有管道操做的类型不一样,其中一个的操做类型为“建立”,另一个为“增长或修改”。当目标数据库中无相应数据表(第一次备份)时,使用“建立” 操做的管道对象;当目标数据库中有相应数据表(不是第一次备份)时,使用“增长或修改”操做的管道对象。在这里,定义两个管道对象为 Pile_Create和Pile_Modify。
2.2.2建立管道的支撑用户对象
建立的两个管道对象Pile_Create和Pile_Modify能够实现交互方式的数据迁移,但还不能在应用程序中使用。为了在应用程序中使用管道对象的属性和函数,应该创建管道对象的支撑用户对象。
为了提升程序的通用性,能够设置一个比较通用的管道对象的用户对象(即不用指定数据对象)。
经过选择“New→Object→Standard Class”,再选择“Pipeline”,创建管道用户对象,其名字设定为uo_pipeline。用户对象uo_pipeline具备6个属性,5个 事件,9个函数,其中在应用程序中较常使用的属性、事件、函数如表一、表二、表3所示。
表1 管道对象的属性
属性名 |
数据类型 |
含义 |
RowsInError |
Long |
指明管道运行期间出错行的行数 |
RowsRead |
Long |
指明管道读入的行数 |
RowsWritten |
Long |
指明管道写出的行数 |
DataObject |
String |
指明管道对象的名称(如Pile_Create) |
表2 管道对象的事件
事件 |
触发时机 |
PipeEnd |
当Start()或Repair()函数执行结束时出发 |
PipeMeter |
每读入或写出一块数据后触发。数据块大小由Commit因子决定 |
PipeStart |
当Start()或Repair()函数开始执行时触发 |
表3 管道对象的函数
函数 |
返回值数据类型 |
功能 |
Cancel |
Integer |
终止管道运行 |
Repair |
Integer |
修正管道用户对象的错误数据窗口,用正确的数据更新目标数据库 |
Start |
Integer |
启动数据管道对象 |
为了可以动态显示管道操做的过程,须要在Uo_Pipeline用户对象的PipeMeter事件中,将Uo_Pipeline的 RowsInError、RowsRead、RowsWritten三个属性值传递给窗口对象显示出来(窗口对象见后,其名称W_CopyData)。通 过窗口对象W_CopyData的自定义窗口级函数getpipemsg()实现(也可经过在w_copydata的declare中定义全局变量实 现)。
在事件PipeMeter写入下面的脚本:
w_copydata.GetPipeMsg(RowsRead,RowsWritten,RowsInError)
2.2.3建立窗口对象
窗口对象用于显示管道操做的动态信息,对管道操做进行监控,当有错误产生时,与管道对象进行交互。其名称为w_copydata。
在w_copydata中包含的控件及做用如表4。
表4 窗口对象w_copydata包含的控件
控件类型 |
控件名称 |
做用 |
静态文本 |
St_T_read |
“读入行数”提示,其text为“读入行数” |
St_t_written |
“写入行数”提示,其text为“写入行数” |
|
St_t_error |
“错误行数”提示,其text为“错误行数” |
|
St_read |
读入行数,其text为u_pipeline的RowsRead值 |
|
St_written |
写入行数,其text为u_pipeline的RowsWritten值 |
|
St_error |
错误行数,其text为u_pipeline的RowsInError值 |
|
数据窗口 |
Dw_pipe_error |
自动显示管道操做中的错误行 |
命令按钮 |
Cb_write |
启动管道操做 |
Cb_stop |
终止管道操做 |
|
Cb_applyfixes |
将Dw_pipe_error数据窗口中修复的行传输给目标表 |
|
Cb_clear |
清除Dw_pipe_error数据窗口中全部错误行 |
|
Cb_return |
关闭窗口w_copydata,并返回 |
定义w_copydata的窗口级函数getpipemsg(),访问级别为“Public”,返回值“None”,有三个参数:readrows、writerows、errorrows,类型均为long,值传递。脚本以下:
w_copydata.st_read.text=string(readrows)
w_copydata.st_written.text=string(writerows)
w_copydata.st_error.text=string(errorrows)
2.3初始化操做
初始化操做包括建立两个事务对象的实例itrans_source和itrans_dest,分别链接源和目的数据库;建立管道对象的支撑用户对象uo_pipeline的一个实例iuo_pipeline。
因为实例变量itrans_source和itrans_dest在启动数据管道操做时(在命令按钮Cb_write的clicked事件中) 也要用到,因此应该将它们定义为全局实例变量。在窗口的declare中选择instance variables,并添加如下脚本:
transaction itrans_source
transaction itrans_dest
uo_pipe iuo_pipe
初始化操做在窗口对象w_copydata的open事件中完成。在w_copydata的open事件中输入下面的脚本:
itrans_source = CREATE transaction
itrans_dest = CREATE transaction
// Profile S,为了增长通用性,参数也能够从导出的profile文件中获取
itrans_source.DBMS = "ODBC"
itrans_source.AutoCommit = False
itrans_source.DBParm = "ConnectString='DSN=s;UID=dba;PWD=ygg'"
connect USING itrans_source;
// Profile D,为了增长通用性,参数也能够从导出的profile文件中获取
itrans_dest.DBMS = "ODBC"
itrans_dest.AutoCommit = False
itrans_dest.DBParm = "ConnectString='DSN=d;UID=dba;PWD=ygg'"
connect USING itrans_dest;
//创建管道对象uo_pipe的一个实例
iuo_pipe = CREATE uo_pipe
2.4启动数据管道
启动数据管道操做在命令按钮Cb_write的clicked事件中进行,以在目标数据库创建数据表(pile_create)做为默认操做,若是出错,则进行数据表修改(pile_modify)。出错行信息会自动出如今数据窗口dw_pipe_errors中。
在命令按钮Cb_write的clicked事件中添加脚本:
iuo_pipe.dataobject = 'p_create'
integer li_start_result
li_start_result=iuo_pipe.start(itrans_source,itrans_dest,dw_pipe_errors)
//返回-3表示数据表已存在,使用修改方式
if li_start_result=-3 then
iuo_pipe.dataobject = 'p_modify'
li_start_result=iuo_pipe.start(itrans_source,itrans_dest,dw_pipe_errors)
end if
2.5处理行错误
在定义管道对象pile_Create和pile_modify时,能够设定最大出错行数,出错行数能够从1~no limit,当出错行数达到指定值时,管道操做自动中止。但在操做中,因为用户进行了误操做或管道操做执行的时间比预期的要长时,用户能够人工中止数据管 道的运行。
当管道操做中止后,若是数据窗口dw_pipe_errors中有出错行,则可进行修复。
数据管道的终止执行能够在命令按钮cb_stop的clicked事件中经过执行数据管道实例对象的cancel()函数实现。脚本以下:
if iuo_pipeline.cancel() = 1 then
messagebox(“提示信息”,”终止数据管道操做失败!”)
end if
忽略错误行的操做在命令按钮cb_clear的clicked事件中进行,脚本以下:
dw_pipe_error.result()
修改数据后,从新提交工做在命令按钮Cb_applyfixes的clicked事件中进行,脚本以下:
iuo_pipeline.repair()
2.6结束操做
管道操做完成后,应该断开数据库的链接,并释放用过的实例。结束操做在命令按钮cb_return的clicked事件中进行,脚本以下:
Destroy iuo_pipeline
DISCONNECT USING itrans_source;
Destroy itrans_source
DISCONNECT USING itrans_dest;
Destroy itrans_dest
Close(parent)
3.结语
使用数据管道在应用程序中实现数据的自动迁移和备份的通常实现方法,本文进行了有益的尝试和探讨。在正确配置的实际系统中,本方法已经实现数据 的正确迁移。整个开发过程在一个窗口用户对象中完成,增长了代码的可移植性和可重用性。固然,在迁移数据的可选择性和通用性方面还有待进一步实践。