时间:2024-07-28
程世民
( 武汉大学经济与管理学院, 武汉430072 )
铁路客票系统已经在全国铁路联网运行了多年,围绕客票系统这根主线,客运站有时会针对客票营销、经营管理等方面进行二次开发,或者需要利用客票系统的一些基础数据。为此,不同类型的数据库之间的数据转换就显得尤其重要。铁路客票系统后台均采用Sybase Sqlserver数据库,而基层客运站使用的最多的是Microsoft SqlServer数据库,为了快速地进行两库之间的数据迁移而又不损失数据精度,武汉铁路局武昌车站根据实际工作需要,研究出了一种利用前端开发工具(PowerBuilder)进行数据有效迁移的方法。
数据转换就是从一个数据存储体导入或导出数据到另一个数据存储体中。对于SQL Server来说,转换数据意味着将源数据存储体中的数据输入到SQL Server,或是从SQL Server输出数据到目标数据存储体中。在这两个过程中,可以对数据进行变换,使其满足简单或复杂的输入数据到目标数据存储体中之前所必须解决的问题。
数据转换执行以下任务:
(1)向数据库中加入数据:输入数据到数据库中。
(2)存档:加载数据库备份,一种特殊的数据输出形式(数据库和日志被拷贝)。
(3)迁移数据:改变数据表示,重构数据。
以下的SQL Server工具、语句和实用程序提供数据转换功能:
(1)Transact-SQL语句INSERT和SELECT INTO。
(2)用于数据存档的工具和语句。
(3)数据转换服务(DTS)。
(4)成批复制程序(Bcp)和BULK INSERT语句。
INSERT语句用来向表中插入一行或多行。SELECT INTO语句用来创建新表并插入由查询选定的行。以上两个语句都有严格限制功能,只能用来插入(复制)少量的行。DTS的目的是在不同的数据存储体之间进行数据的输出、输入和转换。这一工具支持同种和异种的数据存储体,它包含数个组件,是进行该类数据转换的首选。Bcp(成批复制程序)是一个非常有用的实用程序,它可以从/向一个数据文件中复制SQL Server数据。因此,Bcp经常被用来从一个关系数据库管理系统(DBMS)向SQL Server数据库中转换大量的数据。
武昌车站的系统配置为:HP UNIX,Sybase SQL Server12.0。提供的工具有:
(1)Transact-SQL语句INSERT和SELECT INTO。
(2)Isql实用程序。
(3)Bcp实用程序。
(4)安装复制服务器。
IsQL是Sybase SQL Server提供的一个非常实用的应用程序,在与数据库交互时非常方便,利用其-i和-o选项,可以利用提前生成好的批处理.sql文件进行批量传输数据。Sybase的复制服务器解决方法主要是为高速的、基于事务的复制设计的,用于监视数据库的事务日志,一旦一个事务日志被标记,它就被提交给数据库,利用该方法需要较高的专业知识,配置也较为困难。
在实际工作中,若单独使用上述DBMS提供的数据转换工具会有许多局限,而且要实现自动编程很困难,尤其是在异构数据库间实现自动复制数据很困难。现以武昌车站为例介绍数据迁移的实例。武昌车站要根据客票系统中的售票销售存根二次开发进行月度售票员业绩奖金挂钩考核,根据车站制定的销售策略(如不同季节的长短途销售张数,本局和外局销售客票收入等)按收入万元单价或销售张数千张单价由系统自动计算完成。奖金考核系统需从客票系统Sybase SQL Server中迁移数据(基础车次、停靠站表及月度售票存根表)到另一个Microsoft SQL Server系统中(车站根据售票存根进行二次开发以便对每名售票员月度业绩进行考核和奖金挂钩),应用开发用到了客户端数据库开发工具PowerBuilder6.5,利用该工具提供的Data Pipe Object(数据管道对象)进行编程、实现。
从A系统(基于UNIX的Sybase SQL Server客票系统)向B系统(基于Windows2000的Microsoft SQL Server的武昌车站信息服务系统)复制A系统的实时应用数据库表(共700多张)。
利用客户端开发开具PowerBuilder提供的数据管道对象(Data PipeLine)在两个数据源间建立连接、按规则建立管道对象和复制策略、设定相关参数属性,形成最终应用,进行数据复制。经测试,复制效率可达到:2 000行/s,比其它方法的效率高出很多。
(1)创建数据管道,统一用p_表名命名,以便以后用循环处理。创建时在MAX_ERROR处选择NO_LIMIT,COMMIT ROWS选择1000,并选中EXTEND ATTIBUTES,最重要的是若为第1次使用此应用,可以在TABLE和Key处选用默认值,在OPTIONS处选中Create-Add Table,这样的话就可以在B系统中完全创建同A系统中的表(连带扩展属性)。
(2)在PowerBuilder的数据库画板中创建两个数据源con_sourceA和con_sourceB,用以连接A系统和B系统。
(3)创建DataPipe对象:p_pipe,设置3个文本属性值:st_read,st_write,st_error,用以记载数据传输过程中读、写和出错的行数,实例化该对象:p_pipe i_p_pipe。
(4)在PB中创建主界面,如图1。需循环处理的表名数据窗口、出错显示的数据窗口、开始按钮、退出按钮和提示文本框等。
图1 PB中创建的主界面
现将开始按钮的主要部分脚本代码列出如下:
//实例化变量
iPipe = create pipe_obj
//初始化
……
//连接源数据库SQLCA
//连接目的数据库SQLCB
iPipeReturn = iPipe.Start(SQLCA,SQLCB,dw_error)
IF iPipeReturn <> 1 THEN
GOTO Label_Error
END IF
……
//正常复制完表后,进行一些善后处理(断开数据库、变量复位等)
st_1.TEXT = "复制表:"+sTable-Name+"完成!"
(5)编译形成最终应用。
(1)可方便地在不同的DBMS之间复制数据且不改变源DBMS中的表的各项属性。
(2) 可灵活地添加需复制的表,可灵活地选择复制方式(Create<创建方式>或Refresh:Delete/Insert<刷新方式>)。
(3) 灵活地容错及设置事务的功能。
在实际工作中还遇到若B系统与A系统除了DBMS不同外,且IP不在同一个网段该怎么样实现DBMS之间的数据转换呢?比如:
A:客票应用主系统→Unix,Sybase
B:武昌车站客运服务信息系统→Win2000,Sqlserver
C:武昌车站网站系统→Win2000,Sqlserver(与A、B不同网段)
若需从A→C迁移数据,此时可以:
(1) 建立应用,先用B做中间代理,先对B复制数据。
(2) 利用前面提到的快速复制工具Bcp,在B中将数据形成本地硬盘文件。
(3) 用ftp将B中的本地硬盘文件数据打包上传至C系统。
(4) 对包展开。
(5) 再次利用Bcp将展开后的硬盘文件复制到C系统中的DBMS中,此时Bcp的命令行参数要用in。
客运站还有许多方面需要用到数据迁移,随着客票系统自身的发展和完善,围绕客票系统的二次开发应用也会越来越丰富。
数据迁移还涉及到数据格式、数据存储、数据精度等多个方面,在上述方法的基础上如何将本系统继续扩展至XML、WebService等还需要做进一步地研究和细化。
[1] 中华人民共和国铁道部.铁路旅客运输规程[S] . 北京:中国铁道出版社,2007.
[2] 孙玫肖. 售票应用中的常见问题及解决方法[J] . 铁路计算机应用,2002,11(7).
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!