标题 | 基于SQL语句的通用数据交换方法研究与应用 |
范文 | 葛从兵 陈剑 严吉皞![]() 摘 要:为了避免频繁地修改数据交换系统程序代码,提高数据交换系统的通用性,提出了基于SQL语句的通用数据交换方法。该方法根据源数据库和目的数据库结构编写SQL语句,保存至XML文件。数据交换时,数据交换系统从XML文件读入SQL语句,执行相应操作,完成数据交换。该方法已在实践中得到广泛应用。 关键词:数据交换;通用数据交换方法;SQL语句;XML 中图分类号:TP301 文献标识码:A 文章编号:1672-7800(2015)005-0044-03 作者简介:葛从兵(1966-),男,江苏南京人,硕士,南京水利科学研究院教授级高级工程师,研究方向为软件工程;陈剑(1975-),男,江苏南京人,南京水利科学研究院工程师,研究方向为计算机应用;严吉皞(1987-),男,江苏南京人,硕士,南京水利科学研究院工程师,研究方向为计算机理论。 0 引言 随着计算机技术的发展,各行各业对信息化的需求越来越强烈,信息化水平也越来越高。作为国家防洪抗旱减灾体系的重要组成部分和国民经济的重要基础设施,水库也在逐步开展信息化工作。在水库信息化过程中,经常需要在局域网范围内进行数据共享、数据集成或汇聚,这不可避免地涉及到数据交换。但由于水库的监控系统和信息系统由不同时期的不同承建商建设,导致同一水库的不同系统或不同水库的同一类型系统在数据存储上存在诸多差异,若数据交换系统仅针对特定水库,则每个水库的数据交换系统都要根据水库具体情况修改其程序代码,不仅修改工作量大,系统稳定性也得不到保证。因此,本文对数据库差异和数据交换过程进行研究,提出通过读入XML文件中SQL语句[1]实现数据交换的通用数据交换方法,并在实践中得到应用。 1 数据存储差异性与交换过程 1.1 数据存储差异性 现在的信息系统一般采用数据库存储数据,很少采用文件形式存储数据,故本文仅讨论采用数据库的数据存储形式。 在数据交换中,源数据库和目的数据库的数据存储差异性主要体现在以下几个方面: (1)数据库管理系统不同。常用的数据库管理系统有SQL Server、Oracle、MySQL、Sybase、DB2等[2],早期系统有的还采用Access。 (2)实体-联系模型不同。相同一组信息,源数据库存储在两个表中,目的数据库存储在一个表中,或源数据库存储在一个表中,目的数据库存储在两个表中。 (3)字段类型不同。相同信息,源数据库以数值型存储,目的数据库以字符型存储,或源数据库以字符型存储,目的数据库以日期型存储。 (4)字段长度不同。相同信息在源数据库和目的数据库里字符串长度、数值长度或小数位数不一样。 (5)标示符命名规则不同。表名和字段名差异较大。 (6)同一对象,如测点,其名称或编码在源数据库和目的数据库里不同。 (7)同一组信息,源数据库里存储的属性比目的数据库里少。 这些差异性要求数据交换时需进行必要的转换。 1.2 数据交换过程 数据交换一般包括3个步骤:数据提取、数据转换、数据写入。数据提取先连接源数据库,然后从相关表中提取所需数据,数据提取需要知道源数据库的数据库管理系统以及源数据库表结构;数据转换是将来自源数据库的数据转换为符合目的数据库要求的数据,包括数据拆分、数据重组、数据类型及长度变换等,数据转换需要知道源数据库与目的数据库的表结构以及它们之间的对应关系;数据写入先连接目的数据库,然后将转换后的数据写入相关表,数据写入需要知道目的数据库的数据库管理系统以及目的数据库表结构。 数据写入时需考虑目的数据库中已有数据的更新问题。由于数据交换一般针对时间序列数据,即数据元组中含有时间戳,因此可以根据时间段来处理数据更新问题。数据更新有两种方式:①先检测目的数据库是否已有该时间段数据,如果有,用更新语句更新数据,否则用插入语句插入数据;②先直接删除目的数据库中可能有的该时间段数据,然后用插入语句插入数据。后一方式操作相对简单。 2 通用数据交换方法 通用数据交换方法将一次完整的数据交换分为若干个数据交换过程,每个交换过程可以针对数据库里的一个表,也可以针对数据库一个表中的特定数据。数据交换过程由保存在XML文件中的SQL语句控制,SQL语句根据源数据库和目的数据库及其对应关系编写。 控制数据交换过程的SQL语句存储格式如下: DataExchange元素表示一个数据交换过程,它包含一个交换过程所需的SQL语句。 SourceConnection元素和TargetConnection元素为源数据库和目的数据库的连接字符串。连接字符串中必须包含Provider(提供程序)的值,其它值因数据库管理系统和连接方式不同而不同,如Data Source、User ID、Password等。以OLEDB为例,典型连接字符串如下: (1)Oracle:"Provider=MSDAORA;Data Source=;User ID=myUsername;Password=myPassword" (2)SQL Server:"Provider=SQLOLEDB;Data Source=(local); Initial Catalog=mydb;User ID=myUsername;Password=myPassword" (3)MySQL:"Provider=MySQLProv;Data Source=mydb;User ID=myUsername;Password=myPassword" (4)Access:"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\bin\\LocalAccess40.mdb" SelectSQL元素为从源数据库提取数据的Select语句。Select语句可以提取一个表里一个时间段内全部数据,也可以提取一个表里一个时间段内的特定数据,如某个测点的数据,Select语句还可以通过多表连接提取数据。同时,Select语句中的Select子句还承担数据转换工作,包括数据拆分、数据重组、数据类型及长度变换等,这些转换可能用到数据库管理系统提供的函数。Where子句中开始时间和结束时间采用保留字符串“_STTM”和“_ENTM”的方式。由于Select语句里可能包含标点符号,故采用CDATA段[3],即以“<![CDATA[”标记开始,以“]]”标记结束。 DeleteSQL元素为从目的数据库删除数据的Delete语句,它可以避免插入数据时违反主键约束。Delete语句中Where子句一般跟上述Select语句中Where子句存在一致性。 ColumnNum元素表示Select语句的Select子句中前ColumnNum个列的数据将传递至Insert语句。 InsertSQL元素为将数据写入目的数据库的Insert语句。其Values子句包含“_Column0”、“_Column1”、“_Column2”、“_Column3”等保留字符串,用于传递Select语句中的数据,分别对应于Select子句中第1列、第2列、第3列、第4列等。Values子句也可以承担数据转换工作。 3 应用 通用数据交换系统是一个采用基于SQL语句的通用数据交换方法开发,并广泛应用于水库局域网信息共享和数据集成的数据交换系统。其集成开发环境为Microsoft Visual Studio 2010,开发语言为C#,数据库访问采用微软应用程序接口OLEDB,支持常用的数据库管理系统。虽然OLEDB的效率比其它专用数据库接口效率低,但数据交换系统的通用性提高。 通用数据交换系统界面如图1所示。通用数据交换系统有两种交换方式:定时交换和即时交换。定时交换每隔一段时间进行一次数据交换,交换的数据时间段为上次交换截止时间至当前时间,两次交换之间的时间间隔可以是几分钟,也可以是几个小时;即时交换可任意指定本次交换的数据时间段,点击交换按钮后,立即进行交换。定时交换用于实时数据自动交换,即时交换用于历史数据交换。 通用数据交换系统的数据提取和插入代码如下: tstr = select[i].Replace("_STTM", _STTM.ToString()).Replace("_ENTM", _ENTM.ToString()); oledbAdapt.SelectCommand = new OleDbCommand(tstr, oledbConn1); oledbAdapt.Fill(dataSet, "temp"); for (int j = 0; j < dataSet.Tables["temp"].Rows.Count; j++) { tstr = insert[i]; for (int p = 0; p < ColumnNum[j]; p++) { _Column = dataSet.Tables["temp"].Rows[j][p].ToString(); tstr=tstr.Replace("_Column"+p.ToString(),_Column); } try { oledbComm = new OleDbCommand(tstr, oledbConn2); oledbConn2.Open(); oledbComm.ExecuteNonQuery(); } catch { } finally { oledbConn2.Close(); } } dataSet.Tables.Remove("temp"); 上述代码中,字符串数组select和insert分别存放Select语句和Insert语句,oledbConn1和oledbConn2分别连接源数据库和目的数据库,变量_STTM和_ENTM分别存储开始时间和结束时间。数据提取时,均将数据转换为字符串,写入时由Insert语句将其转换成目的数据库里的类型。 通用数据交换系统用于不同水库时,不需要对通用数据交换系统程序进行任何修改,仅需编写XML文件中的SQL语句。典型XML文件内容如下: <?xml version="1.0" encoding="utf-8"?> <_ColumnNum>3 <_ColumnNum>2 上述XML文件中包括两个数据交换过程,它们的源数据库和目的数据库的数据库管理系统均为Oracle,源数据库服务名分别为ORCL1和ORCL2,目的数据库均为本地数据库。由于数据库管理系统为Oracle,所以XML文件中SQL语句均遵循Oracle的SQL语法[4]。第一个交换过程是将源数据库中表MI_SPPR_M中的数据写入目的数据库中的表EGS_SPPR_R,同时将HYCNCD字段内容设置为“BFA89001782F8”,即补充字段内容。第二个交换过程是将源数据库中表MSE_WATER中仪器编号为“'W0005”的数据写入目的数据库中的表ST_RSVR_R。除了将HYCNCD字段内容设置为“BFA89001782F8”外,还要将MPCD字段内容设为“UPWL”,即进行编号转换。 4 结语 本文介绍了一种基于SQL语句的通用数据交换方法。它从XML文件中读取SQL语句,包括数据库连接字符串与Select、Delete、Insert语句,根据这些SQL语句执行数据交换过程。采用该方法开发的数据交换系统,不需要修改程序代码,仅需编写XML文件中的SQL语句,即可用于不同环境下不同系统之间的信息共享和信息集成。基于该方法的通用数据交换系统现已广泛应用于水库局域网内信息共享和数据集成。 参考文献: [1] 王珊,萨师煊.数据库系统概论[M].第5版.北京:高等教育出版社,2014:91-117. [2] ABRAHAM SILBERSCHATZ,HENRY F KORTH,S.SUDARSHAN.数据库系统概念[M].第6版.杨冬青,李红燕,唐世渭,译.北京:机械工业出版社,2012:633-719. [3] JOE FAWCETT,LIAM R E QUIN,DANNY AYERS.XML入门经典[M].第5版.刘云鹏,王超,译.北京:清华大学出版社,2013:32-33. [4] 李兴华,马云涛.Oracle开发实战经典[M].北京:清华大学出版社,2014:56-138. (责任编辑:黄 健) |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。