




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
利用PB的数据管道技术实现数据转储摘 要 PowerBuilder提供了强大的数据库操作功能,包括:数据窗口技术、SQL语句的嵌入式直接应用、数据管道(Data Pipeline)技术等。本文将就利用PowerBuilder的数据管道技术实现数据库之间的数据自动转储进行阐述。主题词 数据库 数据管道 数据转储在油田开发生产信息管理中,数据库技术应用日益广泛,每天大量的生产数据在队、作业区、厂之间的各种不同的数据库系统中流动,因而数据转储是一项重要的信息管理功能。通过数据转储在不同的数据库之间进行数据转储,以保证数据在生产中正常使用。Powerbuilder(以下简称pb)提供强大的数据管道技术(Data Pipeline)。通过数据管道,可以在不同的数据库表之间转储数据,实现一个或多个表中的数据转储到另一个数据库表中,这种数据转储可以在一个数据库管理系统的不同用户中进行,也可以在相同管理系统的两个数据库之间转储数据,甚至可以在不同的数据库管理系统(DBMS)之间进行,它的最大特点是使用方便、可靠性高,数据转储速度快。1 数据转储的实现通过应用程序实现数据的自动转储,要求被操作的源数据库和目标数据库已存在,并且确定相应的数据库接口连接源数据库和目标数据库,建立相应的数据管道(即相应的转储策略),通过应用程序使用数据管道实现数据的转储。本文以油井井史(DBA04)从数据中心(ORACLE 9i数据库)根据所定义的区块单元参数向VFoxPro 5.0 数据库转储阐述利用数据管道转储数据的主要实现技术。1.1 数据库接口程序的确定在PB 中对ODBC数据库接口或专用数据库接口进行配置,使PB 能通过具体的接口与数据库相连。在本文的数据转储实现中,通过ODBC数据库接口连接VFoxPro 5.0数据库,通过PB提供的ORACLE数据库专用接口连接ORACLE 9i数据库。1.2 数据管道的实现步骤在应用程序中使用数据管道有以下六个基本步骤:(1)创建应用程序所需对象;(2)数据库连接;(3)执行数据管道初始化操作;(4)启动数据管道; (5)处理程序运行中移动数据的错误行; (6)执行数据移动完毕后的收尾操作。1.2.1 创建应用程序对象为了在应用程序中实现数据管道,需建立以下几个不同的对象:数据管道对象、支撑用户对象、窗口对象、数据窗口控件对象等。1)数据管道对象的建立数据管道对象利用Powerbuilder提供的pipeline画板中创建并定义它的特征(图1)。图1 数据管道对象建立在此着重说明以下的参数的设置和定义:(1) Commit参数:定义管道操作中数据传输多少行进行提交。由于管道操作中的数据传输实际是在数据库系统的回滚段中进行,而回滚段的大小有一定的限制,所以用户应根据实际转储的数据量大小选择适当的Commit行数,防止回滚段溢出。在本文示例中由于需要转储的数据量巨大,所以在数据管道dba04_pip中定义每1000行提交一次,以防止回滚段溢出。 (2) Data Source的SQL定义:定义源数据库表中被转储的列、选择条件以及列的转换规则等(图2)。在Data Source的SQL中,提供了十分灵活的SQL定义,可以定义多表根据某一项主键信息关联的方法从多个源数据表中形成目标数据表,也可以根据一定的计算从源数据库表派生成新的数据作为目标表的源。数据管道转储数据的灵活和强大实际就是通过Data Source的SQL定义来体现的,也就是通过充分使用源数据库系统的各种操作和函数、表达式来实现灵活的数据转储。在本文示例中,目标数据库表(油井井史.dbf)从数据中心的两个数据库表油井井史(DBA04)和单井基础信息(DAA01)关联得到,按照所定义的数据管道检索参数(QKDY)在单井基础信息表(DAA01)检索出给定检索参数(QKDY)的井号并关联油井井史(DBA04),通过相应的处理形成SQL定义,其中用到ORACLE数据库空值处理函数NVL进行空值处理,以避免DBF数据库出现.NULL.空值表达而影响数据的使用。 语法如下:SELECT DAA01.JH , DBA04.NY , nvl(DBA04.CYFS, ),nvl(DBA04.SCTS,0) , nvl(DBA04.TY,0) , nvl(DBA04.YY,0),nvl(DBA04.RCYL,0) + nvl(DBA04.RCSL,0) ,nvl(DBA04.RCYL,0) , nvl(DBA04.RCSL,0) , nvl(DBA04.HS,0),nvl(DBA04.YCYL,0) , nvl(DBA04.YCSL,0) , nvl(DBA04.BZDM1, ),nvl(DBA04.LY,0) , nvl(DBA04.JY,0) , nvl(DBA04.NCYL,0), nvl(DBA04.NCSL,0) , nvl(DBA04.LJCYL,0), nvl(DBA04.LJCSL,0), nvl(DBA04.DYM,0) , nvl(DBA04.JYM,0)FROM DBA04,DAA01WHERE (DBA04.JH = DAA01.JH ) and (upper(ltrim(rtrim(DAA01.QKDY) = :qkdy)图2 数据管道对象Data Source的SQL定义(3) LONG型字段的处理:在PB中,数据管道对象不能直接选择数据库表中LONG型字段,使用数据管道创建面板的菜单项“Design”中的“Database Blob”来选择LONG型字段。2)创建管道支撑用户对象在应用程序设计时可以设置一个通用的管道支撑用户对象使用管道对象的属性和函数,在本文示例中创建的管道支撑用户是u_pipeline。管道支撑用户对象是一个隐含类对象,利用PB的“New User Object”功能选择标准类(Standard Class)来创建,包括不同的属性、事件及函数(表1)。表1 数据管道支撑用户对象的主要属性、事件、函数属性DataObject,RowsRead,RowsWriten,RowsInError,Syntax事件PipeStart,PipeMeter,PipeEnd函数Start,Repair,Cancel在本文示例中,创建管道支撑用户对象(u_pipeline)时进行了以下的设置和定义:(1) 定义管道支撑用户对象的数据库事物实例:transaction itr_sourcetrans, itr_desttranss,其中itr_sourcetrans用于连接源数据库系统,itr_desttranss用于连接目标数据库系统。(2) 定义管道支撑用户对象的监控实例:定义三个静态文本的监控实例:statictext ist_read,ist_written,ist_error;定义数据管道操作错误行显示数据窗口:datawindow idw_erro。(3) 编辑管道支撑用户对象的PipeMeter事件脚本:ist_error.text=string(this.RowsInError)ist_read.text=string(this.RowsRead)ist_written.text=string(this.RowsWritten)(4) 定义管道支撑用户对象的函数:为了灵活的使用和控制管道操作,在管道支撑用户对象创建时定义以下用户对象函数: uf_cancel() return integer:停止管道操作,函数脚本如下: return this.cancel() uf_error(integer a_rtn_code):管道操作出错信息处理与提示,函数脚本如下: string ls_msgchoose case a_rtn_codecase -1ls_msg=打不开数据管道!case -2ls_msg=列数太多!case -3ls_msg=要创建的表已存在!case -4ls_msg=要增加数据的表不存在!case -5ls_msg=未建立与数据库的连接!case -6ls_msg=传递给管道的参数错误!case -7ls_msg=列不匹配!case -8ls_msg=访问源数据库的SQL语句致命错误!case -9ls_msg=访问目的数据库的SQL语句致命错误!case -10ls_msg=已经达到指定的最大错误数!case -12ls_msg=不正确的表语法!case -13ls_msg=需要关键字,但未指定关键字!case -15ls_msg=数据管道已经在运行!case -16ls_msg=源数据库出错!case -17ls_msg=目的数据库出错!case -18ls_msg=目的数据库处于只读状态,不能写入数据!end chooseif a_rtn_code1 thenmessagebox(数据管道运行出错,ls_msg,StopSign!,Ok!)elsemessagebox(数据管道运行,操作成功!)end if uf_init(transaction arg_sourcetrans, transaction arg_desttrans, datawindow arg_dwerror):数据管道事物对象和错误数据窗口初始化,函数脚本如下:itr_sourcetrans=arg_sourcetransitr_desttranss=arg_desttransidw_error=arg_dwerror uf_repair() return integer:管道错误数据行修复,函数脚本如下: return this.repair(itr_desttranss) uf_start(string qkdy) return integer:执行管道操作,函数脚本如下: return this.start(itr_sourcetrans,itr_desttranss,idw_error,qkdy)3)窗口、数据窗口控件、各种功能执行按钮等的创建:为了在应用程序中实现与管道对象进行交互和监控,需创建窗口对象完成以下基本操作:启动管道;发生错误时,显示并修复错误;终止管道操作等。在创建此对象时,必须包括一个数据窗口控件,此控件为数据管道提供错误行显示,并且由应用程序提供此控件的数据窗口对象,不必由用户指定。本文示例中,建立的窗口对象为:w_dataout(图3)。图3 窗口w_dataout界面1.2.2 数据库连接在对数据管道进行操作前,必须进行源数据库和目标数据库的连接。在本文示例中,定义了一个全局数据库事物变量:transaction oradbf,用于连接目标数据库DBF;而源数据库使用默认事物对象SQLCA连接源数据库ORACLE。根据用户所输入的用户认证信息通过connect进行连接,以源数据库ORACLE连接为例,其脚本如下:String LJCdisconnect;st_link.text=正在连接项目数据库系统(ORACLE)SQLCA.DBMS = ddlb_database.TextSQLCA.ServerName = sle_hostid.textSQLCA.UserID = sle_userid.textSQLCA.DBPass = sle_passwd.textSQLCA.LogID = sle_userid.textSQLCA.LogPass = sle_passwd.textconnect;if sqlca.sqlcode0 then Messagebox(登录错误,无效的联接串,用户名或口令字!重新登录!,StopSign!)sle_userid.text=sle_passwd.text=sle_userid.setfocus()end ifif sqlca.sqlcode=0 thenLJC=T:+trim(sle_hostid.text)SetProfileString (sow_tzh.INI,cosl,dbms,trim(ddlb_database.Text)SetProfileString (sow_tzh.INI,cosl,servername,LJC)st_link.text=源数据库(oracle)登录成功!end if1.2.3 执行数据管道初始化操作 管道初始化操作主要是创建支撑用户对象实例,为管道支撑用户对象赋予特定的数据管道对象,为管道支撑用户对象监控的三个静态文本实例赋予特定的静态文本对象,为管道支撑用户对象的两个事物对象实例赋予数据库连接时使用的数据库事物对象,及为管道支撑用户对象的数据窗口控件实例赋予确定的数据窗口控件。在本文示例中,首先在窗口对象中定义一个管道支撑用户对象实例:u_pipeline iu_pipeline, 并通过如下的脚本进行管道初始化操作,其中调用了管道支撑用户对象的函数uf_init():iu_pipeline=create u_pipelinecb_repair.enabled=falsest_read.text=st_written.text=st_error.text=iu_pipeline.dataobject=dba04_pipiu_pipeline.uf_init(sqlca,oradbf,dw_1)iu_pipeline.ist_read=st_readiu_pipeline.ist_written=st_writteniu_pipeline.ist_error=st_error1.2.4 启动数据管道在做好初始化工作后,就可以启动管道操作了。为了实现这一功能首先需在相应的事件脚本中写入启动程序代码,利用管道支撑用户对象的Start函数来启动指定的管道操作。在本文示例中,按照所定义的区块单元参数通过调用管道支撑用户对象的用户函数uf_start()启动数据管道,在不管出现多少错误数据行的情况一直执行到管道操作结束,每转储1000行数据提交一次,所出现的错误数据行显示在数据窗口控件中,在三个单行文本控件中显示管道操作读出、写入及出错的数据行数,并通过调用用户对象函数uf_error()来显示管道执行结束后的情况,脚本如下:string qkdyinteger li_rtnqkdy=UPPER(trim(sle_qkdy.text)if qkdy= thenmessagebox(运行提示,没有定义区块名!,StopSign!)return -1end ifst_read.text=st_written.text=st_error.text=cb_repair.enabled=falsesetpointer(HourGlass!)li_rtn=iu_pipeline.uf_start(qkdy)if li_rtn1 thensetpointer(Arrow!)iu_pipeline.uf_error(li_rtn)cb_repair.Enabled=trueelsesetpointer(Arrow!)cb_repair.Enabled=falseend if1.2.5 处理程序运行中移动数据的错误行数据管道执行过程中把错误数据行都放置于数据窗口控件中,此控件为每一行提供了一个错误信息列,显示数据错误行的最大行数取决于数据管道对象创建时所定义的参数Max Errors,数据管道在达到最大的错误行数之后自动停止操作。在管道数据窗口控件中一旦有错误行,用户可以进行修复或删除操作。在本文示例中,调用管道支撑用户对象函数uf_repari()进行数据修复,并通过调用用户对象函数uf_error()来显示修复执行结束后的情况,脚本如下:inte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离婚诉讼中夫妻共同债务承担及财产分割起诉协议
- 码头场地租赁合同附带集装箱装卸作业及仓储服务
- 线上线下教育合作合同补充协议及教学资源共享协议
- 码头经营场地租赁与船舶租赁及管理合同
- 离婚协议解除与财产分割法律咨询合同
- 房地产开发项目销售合同签订流程及购房者权益保障
- 园林现场施工课件
- 保密新标准培训
- 第05章 生物化学诊断试剂的研制
- 2025年中医外科拔罐和针灸操作技能考核卷答案及解析
- 信息系统定期安全检查检查表和安全检查报告
- 《传统文化主题班会》课件
- 体育-初中七年级田径大单元教学计划表及立定跳远教学设计、教案
- 完整版项目部组织机构图
- 重度哮喘诊断与处理中国专家共识(2024)解读
- 2024年中国食用变性淀粉市场调查研究报告
- You Raise Me Up二部合唱简谱
- 颅脑外伤患者的麻醉管理专家共识(2021版)
- 质量警示卡模板
- 工厂设备拆除施工方案
- DZ∕T 0219-2006 滑坡防治工程设计与施工技术规范(正式版)
评论
0/150
提交评论