安防监控知识
电力检修|异地同构数据库合并在电力系统中的应用
2016-03-26  浏览:50
安防之家讯:cript>异地同构数据库合并在电力系统中的应用
罗鸣,陈轶佳,龙建忠(四川大学,四川成都 610064)
摘 要:提出了一种新颖的方案,该方案有效地解决了在电力系统数据库实际应用中遇到的特定的异地同构数据库合并问题。该方案利用SQLSERVER2000提供的DBLIBRARY编程接口并通过C++语言加以了实现。还介绍了利用C++通过DBLIBRARY实现对SQLSERVER数据库的操作方法。采用这种编程方法,电力系统数据库开发人员可以根据实际情况对数据库进行特定操作,具有极大的灵活性。
关键词:电力系统数据库;同构数据库合并;SQLSERVER2000;DBLIBRARY随着时代的发展,各个电力企业已经加快了自己信息化的进程,办公自动化(OA)、MIS系统、电力市场和营销系统、电力调度系统(EMS)、配电管理系统(DMS)、呼叫中心(CallCenter)以及电力自动化管理系统已经有广泛的应用。对这些应用而言,数据库均在其中扮演了重要的角色。微软公司的SQLSERV-ER2000数据库具有高性能、可靠性和方便应用的特点,目前已被中国的电力企业广泛采用。
由于行业的特殊性,电力系统的数据库应用环境非常复杂。在实际工作中往往有一些同构数据库同时运行在独立的服务器上。到了一定的时候,由于工作环境变化、服务器升级或数据备份等各种原因,需要将这些异地同构数据库里面的数据合并到一起,存储在同一台服务器上。解决这类问题的传统方案是利用SQLSERVER2000提供的DTS(数据转换服务)功能来实现。然而,由于各个服务器之间相互独立(不提交协议),利用DTS功能的方案往往会遇到数据冲突的问题。
数据冲突的情况往往集中在主键的冲突上。在数据库的表中,往往存在着一个主键,这个主键作为各项记录的唯一标识,是不能重复的。将这个主键作为一张表的标识列,从1开始,逐步递增,命名为MAINID,是最通用的做法。其他的表往往是将这个MAINID作为一个外键索引,通过它来定位其中的各条记录。由于几台服务器之间相互独立,这个MAINID很可能相同。在将具有相同MAINID的数据导入到同一个数据库时,如果不作事先的处理,将肯定出现数据冲突。
针对这种情况,提出了自己编写数据转换接口的方案,将各异地同构数据库里面的数据作适应性的转换后再导入到同一服务器中。

1 方案介绍
为了清楚地说明问题,这里举一个电站地质勘探情况数据库的例子。
1.1 数据库结构介绍
为了说明问题,将实际的数据库结构做了简化。
数据库DB有两个表:MAIN表和DATA表。两表的数据项如下表所示:
MAIN表作为主表,其MAINID项作为主键,且作为表的标识列,种子为1,递增步长为1,具有唯一性,唯一对应着一个勘测地区。Directory数据项表示存储相应地区的地质勘测图像文件的文件夹名。
DATA表中MAINID作为外键索引,对应着MAIN表中的数据。表明该行数据的PicName数据项代表的地址勘测图像文件存储在MAIN表中具有相同MAINID的Directory数据项代表的文件夹下面,Pic-Name数据项服从UNIQUE约束,也就是说文件名是唯一的,不能重复。
1.2 方案的主要步骤
(1)登陆到源数据库。源数据库就是各个独立的数据库。
(2)将MAIN表和DATA表的数据分别导出到oldmain.txt和olddata.txt文件中。文件的第一行存储数据项的数目,之后每行对应着数据库中相应表的一条记录,同一行每一列数据之间用逗号“,”隔开。最后一行是自定义的文件结束标志“~”。
例如,oldmain.txt里的数据可能是这样的:

(3)将main表中最小的MAINID存储在min-mainid.txt文件中。
(4)连接到目标数据库。目标数据库往往就是最终数据所在的数据库。
(5)将目标服务器main表中最大的MAINID存储在maxmainid.txt文件中。
(6)根据maxmainid.txt和minmainid.txt文件里的数据,计算出源数据库里的MAINID的改变量,计算公式如下:
ChangeMent=MaxID+1-MinID
其中,ChangeMent是源数据库中MAINID的改变量,MaxID是目标数据库中最大的MAINID,MinID是源数据库中最小的MAINID。
(7)逐行读取oldmain.txt,olddata.txt文件,根据求出的ChangeMent,将对应的MAINID修改后,再写入到新的文件newdata.txt,newmain.txt中。MAINID的修改公式如下:
NewID=OldID+ChangeMent
其中,NewID是修改后的MAINID,也就是入到目标库后,该项数据对应的MAINID;OldID是该项数据在源数据库中的MAINID,ChangeMent是上面计算出来的MAINID的该变量。

(8)将newdata.txt,newmain.txt中的数据逐行读出,插入到目标机数据库中去。
(9)退出。
上述步骤的流程如图1所示。
2 编程方法
在这里介绍一下利用DBLIBRARY编程操作SQLSERVER2000数据库的方法。
2.1 DBLIBRARY介绍
DBLIBRARY是SQLSERVER2000提供的用C语言开发SQLSERVER2000应用程序的函数库。他包含了一系列应用程序编程接口(API)和一些用于与SQLSERVER2000通信的宏(macros)。他提供了连接到SQLSERVER2000服务器的函数,向SQLSERV-ER2000发送T-SQL命令及获取这些命令的结果的函数,还提供了异常处理以及数据转换等相关的功能函数。2.2 利用DBLIBRARY编程的过程
下面的代码完成了登陆到数据库,读出数据库DB里面MAIN表里面的数据,并一行行写入到old-main.txt的功能。

interr_handler(PDBPROCESS,INT,INT,INT,LPCSTR,LPCSTR);//声明errorhandler和messageintmsg_handler(PDBPROCESS,DBINT,INT,INT,LPC-STR,LPCSTR,LPCSTR,DBUSMALLINT);
main(){//主函数
PDBPROCESSdbproc;//与SQLServer的连接结构
PLOGINREClogin;//登陆信息




以上程序说明了利用DBLIBRARY开发数据库应用程序的通用步骤,现将要点总结如下。
(1)dberrhandle和dbmsghandle:dberrhandle:安装了用户自定义的错误处理函数,这是一个回调函数,当发生DVLIBRARY定义的错误时,系统会自动调用这个函数。类似的,dbmsghandle安装了用户自定义的消息处理函数。
(2)dblogin:返回一个LOGINREC结构,用来登陆到服务器。两个辅助函数DBSETLPWD和DB-SETLUSER设置了用户ID和登陆密码。
(3)dbopen建立了一个和SQLSERVER的连接,返回了一个DBPROCESS类型的结构,该结构扮演了在应用程序和SQLSERVER之间协调的角色。当该函数执行成功后,应用程序就可以向SQLSERVER发送T-SQL查询语句并处理查询结果了。之后的操作都可以利用这个返回的DBPROCESS类型的结构进行数据库相关操作指导退出。
(4)dbcmd用用户的TSQL查询语句填充命令缓冲区。
[1][2]下一页
安防之家专注于各种家居的安防,监控,防盗,安防监控,安防器材,安防设备的新闻资讯和O2O电商导购服务,敬请登陆安防之家:http://anfang.jc68.com/
更多»您可能感兴趣的文章:
更多»有关 安防之家 的产品:
  • 安防监控资讯
  • 发表评论 | 0评
  • 评论登陆
  • 移动社区 天花之家 木门之家 灯具之家 铁艺之家 幕墙之家 五金头条 楼梯头条 墙纸头条 壁纸头条 玻璃头条 老姚之家 灯饰之家 电气之家 全景头条 照明之家 防水之家 防盗之家 区快洞察 建材 枣庄建材 临沂建材 南昌建材 上饶建材 抚州建材 宜春建材 吉安建材 赣州建材 鹰潭建材 新余建材 九江建材 萍乡建材 景德镇陶瓷 石家庄建材 衡水建材 廊坊建材 沧州建材 承德建材 建材之家 企业之家 720全景
    (c)2015-2017 Bybc.cn SYSTEM All Rights Reserved