首页 > 代码库 > PB数据管道

PB数据管道

数据管道提供了一种不同数据库之间传递数据和(或)表结构的方法。


数据管道对象
要完成数据管道的功能需要提供如下内容:
需要数据源和目标数据库,并能够和这两个数据库正常联接
需要源数据库中的哪些表;
需要复制到目标数据库中的什么位置;
要完成哪些管道操作;
发生错误的频率;
允许发生错误的最大数;
需要包括的扩充特性。


数据管道画板
New —> DataBase —> Data Pipeline
数据管道选项:
Table:目标表名
Key:目标表的主键名(非主键字段名)
Options:管道选项
Create:添加表、Replace:替换已存在的表、Refresh:删除或者插入行、Append:插入行、Update:更新或者插入行
Max Errors:允许的最大错误数
Commit:被提交的事务处理内的行数
Extended Attributes:扩充特性是否管道化

Design->Database Bolb 处理Blob类型的字段

如果在目标数据库中只创建数据表而不拷贝原来的数据,可以通过定义永远不成立的检索条件来实现,比如2<1作为检索条件。


数据管道用户对象
New —> PB Object —> Standard Class —> OK —> 选中pipeline —> OK


属性:
DataObject:指定使用哪个数据管道
该属性是数据管道最重要的一个属性,有些类似于数据窗口控件的DataObject属性。此属性只能在运行时设定,虽然在用户对象画板中也提供了设置该属性的地方,但这好像不起作用。下面是一个为管道用户对象设定DataObject的例子:
iuo_pipeline.DataObject="p_copy_employee"
数据窗口控件的DataObject属性如果在脚本运行时动态修改,则形成发行文件时,在执行文件中不能包括相应的数据窗口对象。与此类似,数据管道对象也不能包括在执行文件中,并且也不能包括在资源文件pbr中,只能放置到pbd或者dll文件中。

RowsInError:错误记录数
Long类型,表示管道运行时已经发生的错误数。该值肯定不会大于管道画板中定义的MaxErrors的取值。

RowsRead:已经读取的记录数
Long类型,表示管道运行时已经读取的数据记录数。该值肯定不会大于管道画板中Commit中定义的取值。

RowsWritten:已经成功写入的记录数
Long类型,表示已经写入到数据库中的数据记录数

Syntax:管道对象的语法
该属性也是一个非常重要的属性,它体现了管道的全部定义,在某种程度上可以把它用做一个管道。利用该属性可以构造出通用性很强的数据管道,因为可以使用Mid,Pos,Len,Left和Right等字符串处理函数修改数据管道Syntax的语法,以适应程序运行时的情况。
可以选择管道用户对象 —> 右键:Edit Source查看语法


事件:
除了两个标准事件constructor和Destructor之外,还有三个数据管道用户对象所特有的事件,它们是PipeStart,PipeMeter和PipeEnd。这三个事件分别在管道执行时、执行期间和执行结束后触发。通常使用这三个事件和管道的某些属性来反映执行进度。

PipeStart事件在调用管道函数Start()或者Repair()之后触发。PipeMeter事件在提交某个事务处理之后触发,这通常是在处理的记录数达到Commit值规定的数时,PipeEnd事件在函数Start或者Repair的执行过程终止时触发。


函数:
Start:
pipelineobject.Start(sourcetrans,destinationtrans,errordatawindow{,arg1,arg2,...,argn } )
其中,pipelineobject为管道用户对象类型变量,在执行该函数之前它的DataObject属性有明确的取值;sourcetrans为联接源库的事务对象,destinationtrans是用来联接目标库的事务对象,这两个事务对象在此之前都应该和相应的库正确建立了联接;当管道执行时如果发生错误,它的错误信息显示在errordatawindow数据窗口控件中。没有必要为该控件指明数据窗口对象,即使指明在显示错误信息时该数据窗口对象也被替换。前面这三个变量是必须要指明的,否则该函数无法正常工作。后面的变量根据数据管道是否定义了检索变量而定。如果数据管道定义了检索变量,arg1,arg2,...,argn要指定,并且变量的个数和检索变量的个数相同,并且对应的类型相同。如果管道对象定义了检索变量,而在Start函数中没有提供相应的值,在管道运行时系统会弹出对话框,要求用户输入检索变量。函数执行时的返回值情况比较复杂,如下所示:
返回值 含义
1 函数执行成功
-1 管道打开失败
-2 列太多
-3 目标表已经存在
-4 目标表不存在
-5 联结错误
-6 检索变量错误
-7 列不匹配
-8 源中有致命的SQL错误
-9 目标中有致命的SQL错误
-10 超出了最大的错误数
-12 表语法错误
-13 没有提供必须的主键
-15 管道操作已经进行
-16 源数据库中有错误
-17 目标数据库中有错误
-18 目标数据库是只读的


Repair:
在脚本中运行管道,发生错误后必须进行一定的处理。Repair函数就是在管道执行发生错误后应该执行的。
错误发生后,错误信息及错误数据显示在Start函数errordatawindow变量指定的数据窗口控件中。用户在修改错误后可以再次提交数据,这时调用Repair函数。这相当于在数据管道画板中发生错误后使用Painter Bar中的小图标按钮Update DB,或者使用菜单项Design->Update Database。

pipelineobject.Repair ( destinationtrans )
其中,pipelineobject是管道用户对象类型变量,在执行该函数之前它的DataObject属性有明确的取值;destinationtrans是和目标库建立联接的事务对象。函数的返回值也比较复杂,如下所示:
返回值 含义
1 函数执行成功
-5 联结错误
-9 目标中有致命的SQL错误
-10 超出了最大的错误数
-11 无效的窗口句柄
-12 表语法错误
-15 管道操作已经进行
-17 目标数据库中有错误
-18 目标数据库是只读的


Cancel:
该函数可以终止正在执行的管道,在用户要强制退出某数据管道时可以调用该函数。

pipelineobject.Cancel()
函数正确执行返回1,否则返回-1。


运行数据管道

在数据画板中直接运行
使用菜单项Design -> Execute或者PainterBar中的Execute小图标按钮来执行当前的数据管道。管道运行过程中,如果出现错误信息,应该根据错误信息修改管道的定义,然后重新运行。
如果为提取源表数据指定了检索变量,则在执行时要求用户输入取值,然后使用该值检索源数据窗口中符合该条件的数据。如果没有定义检索参数,则直接从源表中读取数据。

在程序中执行管道
需如下步骤:
创建相关对象
和源目标数据库建立联接
创建数据管道,并设置其相关属性
执行管道,并处理各种异常。

在脚本中使用数据管道,需要创建三个对象:数据管道对象、数据管道用户对象以及一个保存错误信息的数据窗口对象,其中数据窗口对象是在管道运行错误时由系统自动创建的,数据管道对象在数据管道画板中创建,数据管道用户对象在Standard Class用户对象中创建。