PowerBuilder第16讲 数据管道_第1页
PowerBuilder第16讲 数据管道_第2页
PowerBuilder第16讲 数据管道_第3页
PowerBuilder第16讲 数据管道_第4页
PowerBuilder第16讲 数据管道_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第16讲数据管道本章首先介绍数据管道的基本概念,说明数据管道对象的定义方法以及如何在数据管道画板中运行和修改管道,然后介绍数据管道的属性、事件、函数,并说明程序中使用数据管道的基本步骤,最后介绍一个完整的数据管道应用示例,并给出一个可重用的数据管道用户对象。

通过数据管道(DataPipeline),应用程序能够在不同的数据库表之间移动数据,也就是说,可以把一个或多个源表中的数据复制到新表或已存在的目的表中,复制的方式根据应用程序的需要而定,可以删除目的表及其数据后重建目的表,也可以只把最新数据传送到目的表中。而且,上述的数据迁移可以在同一个数据库不同表之间进行,也能够在同一个数据库管理系统的不同数据库之间进行,当然,需要时也完全可以在不同数据库管理系统的不同数据库之间进行。除了迁移常规数据(比如数值型、字符型等)外,数据管道还可以在数据库之间迁移图像、声音之类的大二进制对象(Blob型数据)。16.1数据管道的概念数据管道提供了在数据库内部、数据库之间,甚至不同的数据库管理系统之间快速复制数据的简便途径。利用数据管道复制数据的过程称之为灌入数据(PipingData)。一、数据管道可以完成普通方法难以完成的任务,比如:把一个或多个表中的数据灌入到相同DBMS或不同DBMS的一个表中。例如,它可以把Oracle数据库实例OO的一个或多个表中的数据复制到Oracle数据库另一个实例OR的一个表中,也能够将这些数据灌入到Sybase数据库中。而且,在复制数据时,数据管道可以把表的属性一起复制。把整个表一次性地复制到另一个数据库中,当然,需要时也可以把PowerBuilder的资源库(RepositoryTable)复制到另一个数据库中,这在部署使用动态数据窗口的应用程序时特别有用,它使开发环境和应用环境达到高度的一致。

创建一个与原表有相同结构,但不包含数据的表,即复制表结构。将网络数据库服务器上的数据复制到本地的SQLAnywhere数据库中,这样用户就可以使用客户机本地的数据库而无须每次都使用网络,减轻了网络的通讯压力。提供了在修改表结构的同时保留表中数据的另一种手段。用数据库画板或表画板修改表时,有些选项不能修改,比如,大多数数据库不允许把空列(NULL)修改为非空列(NONULL)。此时,我们可以用数据管道创建一个新表,新表与原表的结构相同,但属性按我们的需要设置。用数据管道复制数据时,可以复制表中所有数据,也可以复制部分数据,甚至还可以复制出加工了的数据。二、数据管道是PowerBuilder的一个对象,它的使用方法有两种:用数据管道画板创建数据管道对象,然后在数据管道画板中运行数据管道对象;在应用程序中通过编写代码使用数据管道。用数据管道画板创建并保存数据管道对象,用用户对象画板定义出基于数据管道对象的用户对象,编写需要的事件处理程序,在代码中运行管道。无论哪种方法,使用之前都需要首先创建数据管道对象。16.2创建数据管道对象一、创建数据管道对象创建数据管道对象时,需要确定下述选项:①源数据库;②目的数据库;③要从中复制数据的源表;④要存放数据的目的表;⑤要执行的数据管道操作类型;⑥运行数据管道时事务提交的频率;⑦容许出现的最多错误数;⑧是否要把表的扩展属性一起传送到目的数据库中。实际上,上述选项的结果都将包含到数据管道对象中。那么怎样创建数据管道对象呢?答案是用数据管道画板(DataPipelinePainter)。蒋新卉二、创建数据管道对象可以像创建窗口Window、数据窗口对象Datawindow那样创建数据管道对象。在PowerBuilder主窗口的工具栏选择New,单击Database页,如图15.6所示。选择DataPipeline,将出现标题为NewDataPipeline的窗口,如图15.7所示,选择数据源DataSource、源数据库和目标数据库。数据源DataSource的含义同创建数据窗口对象Datawindow一样。图15.6创建数据管道对象图15.7选择源数据库和目标数据库⑶在NewDataPipeline对话框中,全部选项分为了两个组框:DataSource组框用于选择数据源,这些数据源的作用与创建数据窗口时的数据源完全相同,它们生成指定的SQLSELECT语句;DataConnection组框用于指定提取数据的源表所在数据库所对应的数据库描述文件和目的表所在数据库所对应的数据库描述文件,如果所需的数据库描述文件没有在列表框中列出,那么必须使用数据库画板创建相应的数据库描述文件。⑷分别在SourceConnection(源连接)列表和DestinationConnection(目的连接)列表中选择源数据库、目的数据库,在DataSource中选择数据源,然后单击OK按钮,系统根据所选数据源的不同,出现不同的画面,按照与定义数据窗口数据源相似的方法定义数据源,定义了数据源之后,系统打开数据管道画板。若数据源DataSource选QuickSelect,则源表只能选择一个,如图15.8所示,选择要复制的列。然后单击OK按钮,将出现前面已讲的图15.3。图15.8选择列三、数据管道的保存和使用如果想把数据管道保存起来一边今后使用,可以单击Painter工具条的Save按钮;使用一个已有的数据管道的步骤:⑴单击PowerBar的Pipelin按钮;⑵在随后出现的对话框种选择所需要的管道;⑶修改管道的定义;⑷运行管道。四、打开和修改数据管道

保存数据管道后,再次打开和修改。在主窗口的工具栏选择Open,在对象类型ObjectType中选择Pipelines,在对象

Object中选择要打开的数据管道。 点击OK按钮,出现前面已讲的界面。

五、删除数据管道

打开Library库管理器,打开要删除的数据管道所在的PBL,选择要删除的数据管道,右击,出现弹出式菜单,选择Delete将删除所选的数据管道。

图15-10删除数据管道16.3数据管道对象的属性、事件和函数16.3.1数据管道属性数据管道对象的属性共有6个,反映了当前使用的数据管道对象、语法、数据管道运行情况等信息:ClassDefinition、DataObject、RowsInError、RowsRead、RowsWritten、Syntax。其中:(1)DataObject属性的数据类型为String,用于保存数据管道对象名(在数据库画板中创建的对象),其作用与数据窗口控件的同名属性的作用十分相似,该属性指定与数据管道对象相关联的数据管道对象名,与数据窗口控件不同,数据管道用户对象的DataObject属性只能在代码中设置,例如:u_pipeline.DataObject="p_student"中,u_pipeline是数据管道对象的实例,p_student是在数据库画板中创建的数据管道对象的名称。(2)RowsInError的数据类型为Long,它指示数据管道运行过程中发现的错误个数(比如存在键值重复的行等)。例如,如果数据管道处理了100行数据,其中发现了7个错误,那么RowsInError的值就是7。(3)RowsRead的数据类型为Long,它指示数据管道运行过程中当前已经读取的行数。对前面的示例来说,RowsRead的值为100。(4)RowsWritten的数据类型为Long,它指示数据管道运行过程中当前已经写入的行数。对前面的示例来说,RowsWritten的值为93。(5)RowsInError、RowsRead和RowsWritten属性提供数据管道运行过程中的状态信息。这些属性通常显示在应用程序的窗口中,让用户了解数据管道的执行进程。(6)Syntax属性的数据类型为String,保存用于创建数据管道对象的语法(在数据管道画板中创建的对象)。利用字符串操作函数(如Mid()、Pos()、Len()),可以动态修改数据管道对象语法。16.3.2数据管道事件数据管道有5个预定义事件,在创建数据管道用户对象时,可以根据应用程序的需要定义自己的用户事件。预定义事件的有如下5种。(1)Constructor:在数据管道用户对象创建时触发。(2)Destructor:在数据管道用户对象删除时触发。(3)PipeStart:开始执行Start()或Repair()函数时触发。(4)PipeMeter:每次读或写一块数据时触发,设计数据管道对象时定义的Commit参数的大小决定了块的大小。也就是说,数据管道每执行完一个数据库事务时都会触发PipeMeter事件。(5)PipeEnd:Start()或Repair()函数执行结束时触发。16.3.3数据管道函数数据管道对象有9个函数,其中ClassName()、GetParent()、GetContextService()、PostEvent()、TriggerEvent()、TypeOf()与其他对象相应函数的意义相同,在此不再重复,下面介绍数据管道对象特有的三个函数Start()、Repair()、Cancel()。1.Start()函数Start()函数执行数据管道对象,将数据从源表按SQLSELECT语句指定的要求复制到目标表中。格式:pipelineobject.Start

(sourcetrans,desttrans,errordw[,arg1,arg2,...,argn])其中:(1)pipelineobject是包含要被执行数据管道对象的数据管道用户对象名称。(2)sourcetrans是连接到源数据库的事务对象名,可以是默认的事务对象SQLCA,也可以是应用程序创建的事务对象。(3)desttrans是连接到目标数据库的事务对象名,可以是默认的事务对象SQLCA,也可以是应用程序自己创建的事务对象。(4)errordw是个数据窗口控件名,该控件用于显示数据管道运行过程中出现的错误。程序中无须把某个数据窗口对象关联到该控件上,系统会根据出现的数据管道错误自动生成所需的数据窗口对象。如果程序中已经在该控件上关联了某个数据窗口对象,运行时该对象将被数据管道创建的对象取代。(5)arg1,arg2,…,argn是可选参数,对应于定义数据管道数据源时SELECT语句所需的检索参数。Start()函数返回一个Integer值指示数据管道的运行是否成功,返回值的意义为:1 函数执行成功-1打不开数据管道(如数据管道对象不存在)-2列数太多-3要创建的表已经存在-4要增加数据的表不存在-5未建立与数据库的连接-6参数错误-7列不匹配-8访问源数据库的SQL语句致命错误-9访问目标数据库的SQL语句致命错误-10已经达到指定的最大错误数-12不正确的表语法-13需要关键字但未指定关键字-15数据管道已经在运行-16源数据库出错-17目标数据库出错-18目标数据库处于只读状态,不能写入数据。例:已知一个数据管道用户对象u_pipe和一个数据管道对象p_pipe,请从I_srcI_dst.i_upipe=CREATEu_pipei_upipe.DataObject="p_pipe"i_upipe.Start(i_src,i_dst,dw_1)2.Cancel()函数在数据管道运行过程中,执行Cancel()函数后将终止数据管道的执行。格式:pipelineobject.Cancel()该函数执行成功时返回1,失败时返回0。

3.Repair()函数数据管道运行后,如果某些行不能传送到目标数据库,就产生了错误,出错的行显示在与数据管道对象相关联的数据窗口中,用户在数据窗口中修改了数据后,使用Repair()函数,将修改结果传送到目标数据库。格式:pipelineobject.Repair

(desttrans

)其中:pipelineobject是包含要被执行数据管道对象的数据管道用户对象名称。desttrans是连接到目标数据库的事务对象名。Repair()函数的返回值:1 函数执行成功-5未建立与数据库的连接-6参数错误-9访问目标数据库的SQL语句致命错误-10已经达到指定的最大错误数-12不正确的表语法-15数据管道已经在运行-17目标数据库出错-18目标数据库处于只读状态,不能写入数据16.4数据管道编程实例

在程序中使用数据管道的基本步骤为:创建数据管道对象,如果不存在的话定义Pipeline的标准类用户对象(或在代码中定义Pipeline对象实例)

创建窗口,在窗口上放置一个数据窗口控件

编写代码

处理行错误结束管道操作

在该例中,先选择复制方向:是从服务器数据库下载数据到本地库,还是将本地库数据上传到服务器数据库以更新数据;然后选“开始”按钮,执行数据复制操作,在复制的过程中,可以点“取消”按钮,将取消正在进行的复制操作。复制操作的执行状况显示在数据窗口控件中,结果显示在三个静态文本框中。

图15-11数据管道应用实例步骤如下:

(1)

创建一个mypipe.pbl文件,其ApplicationObject名为pipedb。再创建窗口w_pipe,在w_pipe上,创建一个组框gb_1、两个单选按钮rb_down和rb_up、开始命令按钮cb_ok、取消命令按钮cb_cancel、返回命令按钮cb_return、静态文本框st_read、静态文本框st_written、静态文本框st_error、数据窗口控件dw_1。

(2)

创建两个数据管道:p_student_ltos将本地数据库中的表student中的部分数据上传到服务器数据库中的表student以更新数据;p_student_stol将服务器数据库中的表student中的部分数据下载到本地数据库中的表student中。这两个数据管道都定义了string类型的检索参数str,并在编辑SQL数据源中加上条件“wherestudent.class=:str”,表示仅处理指定的班级。

(3)在窗口w_pipe中定义函数wf_connectlocaldb()表示连接本地数据库、wf_connectserverdb()表示连接服务器数据库、wf_error(integerret)错误处理、wf_startpipe(Transaction

sourcetrans,Transactiondesttrans,stringp_object)开始管道操作。

15.3数据管道编程实例(4)

编写代码

l

在ApplicationObject对象pipedb的open事件中编写以下代码open(w_pipe)l

在窗口w_pipe中,声明以下InstanceVariables对象实例:

//定义两个事务处理对象serverdb和localdb //serverdb用来连接服务器数据库

//localdb用来连接本地库

transactionserverdb,localdb //定义数据管道对象u_pipe pipelineu_pipel

在窗口w_pipe的open事件中编写代码:

//定义事务处理对象实例变量localdb和serverdbserverdb=createtransactionlocaldb=createtransaction//定义数据管道对象实例变量u_pipe=createpipelinel

在窗口w_pipe的close事件中编写代码://释放数据管道对象destroyu_pipe;//释放事务处理对象disconnectusinglocaldb;destroylocaldb;disconnectusingserverdb;destroyserverdb;15.3数据管道编程实例l

在“取消”命令按钮的clicked事件中编写代码:intretret=u_pipe.Cancel()//终止管道运行ifret=1then

messagebox("取消操作成功 ","终止管道运行")else

messagebox("取消操作失败","未能终止管道运行")endifl

在“返回”命令按钮cb_return的clicked事件中编写代码:close(parent) //关闭当前窗口l

在连接本地数据库的函数wf_connectlocaldb()中编写代码:

//该函数无参数,返回值为sqlcode//连接本地库localdb.autocommit=truelocaldb.DBMS="odbc"localdb.database="student"localdb.userid="dba"localdb.dbpass="sql"localdb.servername=""localdb.logid=""localdb.logpass=""localdb.dbparm="connectstring= 'dsn=student;uid=dba;pwd=sql'"connectusinglocaldb;returnlocaldb.sqlcode

15.3数据管道编程实例l

在连接服务器数据库的函数wf_connectserverdb()中编写代码://该函数无参数,返回值为sqlcode//连接服务器数据库//这里为方便实验,选用了另一个本地库mathserverdb.autocommit=trueserverdb.DBMS="odbc"serverdb.database="math"serverdb.userid="dba"serverdb.dbpass="sql"serverdb.servername=""serverdb.logid=""serverdb.logpass=""serverdb.dbparm="connectstring='dsn=math;uid=dba;pwd=sql'"connectusingserverdb;returnserverdb.sqlcode

l

在错误处理函数wf_error(integerret)中编写代码://该函数的入口参数ret,表示执行数据管道操作返回的错误代码。//该函数无返回值。stringmsgChooseCaseret Case-1msg="打不开数据管道" Case-2msg="列数太多" Case–3

msg=“要创建的表已经存在”

Case-4

msg="要增加数据的表不存在" Case-5

msg="未建立与数据库的连接" Case–6msg="参数错误"Case–7msg="列不匹配" Case-8

msg="访问源数据库的SQL语句致命错误"

Case-9

msg=“访问目标数据库的SQL语 句 致命错误" Case-10

msg=“已经达到指定的最大错误数"Case–12msg="不正确的表语法" Case-13

msg=“需要关键字、但未指定关键 字" Case-15

msg="数据管道已经在运行" Case–16msg="源数据库出错" Case–17msg="目标数据库出错" Case-18

msg=“目标数据库处于只读状态, 不能写入数据"EndChooseMessageBox("数据管道运行出错",msg,StopSign!,ok!)15.3数据管道编程实例l

在执行管道操作的函数wf_startpipe(Transaction

sourcetrans,Transactiondesttrans,stringp_object)中编写代码://该函数有三个入口参数sourcetrans、desttrans、p_object//该函数无返回值。//参数sourcetrans表示源事务处理对象//参数desttrans表示目标事务处理对象//参数p_object表示在数据库画板中创建的数据管

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论