双方数据库中都在每个表中增加两列,分别用于检测数据是否是自身数据(_InsertType 0: 自身数据;1:非自身数据)和记录数据的实际插入时间(AddDate);
同步时间设置,按指定时间或者循环间隔时间来进行同步操作;
每次启动同步时,都将每个表中自身的新增数据读取出来,然后通过建立起的Socket连接传输给对方,并更新最后同步时间以便下次更新时使用;对方接收到数据后,插入到指定的表中,其中_InsertType的值都设置为1;如果有与数据记录相关联的磁盘文件,则要把文件从源服务器原样复制到目的服务器。
程序实现:
1. 网络连接建立:
双方服务器通过设置自身的服务器端/客户端来确定网络通信中的角色。
确定好的后将信息存入config.xml文件中。
2. 数据库修改及连接设置:
1)数据库修改:
数据库所有用户表添加AddDate来存储数据的插入时间,用来进行更新。
数据库所有用户表添加_InsertType来存储数据是否是自身数据。
declare @Tname varchar(50)
declare CurT cursor for Select [name] From SysObjects Where XType='U' order By Name
open CurT
fetch next from CurT into @Tname
while @@fetch_status=0
BEGIN
--为每个表添加AddDate列默认值为当前时间
exec ('ALTER Table '+@Tname+' ADD AddDate datetime DEFAULT GETDATE() Not NULL')
--为每个表添加_InsertType列默认值为0
exec ('ALTER Table '+@Tname+' ADD _InsertType int DEFAULT 0 Not NULL')
fetch next from CurT into @Tname
end
close CurT
deallocate CurT
2)数据库连接设置:
填写本地与远程数据库的连接所需信息,以便程序连接两个数据库。然后保存到config.xml文件中。
3.同步时间设定:
填写同步数据的时间,保存到config.xml文件中。
4.数据同步文件生成、传输及插入:
提取源数据库自身的数据,Socket网络传输,在建立连接下的客户端与服务器端通过当前的有效连接进行传输,当前连接不存在时,重新进行网络连接;而传输失败时应该可以重新传输。每次传输一个表的数据。
接收到数据后,根据当前表名,找到指定的数据库中的表,执行插入操作,插入时,指定_InsertType的值为1,即标示为接收到的数据。自增列不进行数据插入,没有值的列也不进行插入。