连锁系统数据同步的问题,高手请进(这是一个很实在的问题,个人觉得很难,提出来大家讨论)
连锁管理系统一般都有一个总部,下面管理很多分部(可以是分公司或门店,就象沃尔马),这样就存在这样一个需求:所有分公司的业务数据(比方说,销售
数据)都要汇总到总部,便于总部进行业务分析;另一方面,基本信息(比如商品信息)必须在整个连锁系统统一,只能由总部录入,然后发送到各个分部,这
样就存在数据的发送和接收的问题,现在有以下几种方案:
注意:基于目前的国情,很多中小型的连锁系统不可能采用专线连接的方式,一般门店和总部采用拨号的方式,定时发送和接收数据
1、采用VB+ADO:利用ADO的Persistance功能,通过一个recordset打开要发送的数据,然后通过save方法把记录集保存为一个本地文件,然后把该文件打包压缩
,再通过FTP或E-mail或RAS把数据发送给对方,对方在接受到数据后,再通过ado的recordset打开接收并解压过的文件,再把recordset中的数据导入数据库,当
然,再导入的过程中牵涉到冲突处理的问题(比方说,要导入的记录再数据库中已经存在,例如重复发送和接收的时候)
大概过程如下:
发送时:
rs.open "SELECT * FROM TABLE1 WHERE ...",CONNECTION
rs.save "c:\a.xml",adPersistXML
rs.close
set rs = nothing
接收时:
rs.Open "c:\a.xml", , adOpenStatic, adLockReadOnly, adCmdFile
do while not rs.eof
connection.execute "INSERT INTO TABLE1 (FIELD1,FIELD2,...) VALUES (RS.FIELDS(0).VALUE, RS.FIELDS(1).VALUE,...)
rs.movenext
loop
rs.close
set rs = nothing
注意:上述接收过程中,最后一个循环的速度很慢
2、通过SQL DMO类库中BCP类的功能,通过批量导入和导出的方式来发送和接收数据,这种方式速度比第一种方案要快,但是只能导出和导入整个表,很多时候不
实用;
3、通过SQL Server的T-SQL语言中的OpenDatasource函数,通过Access数据库来导入和导出数据,如下:
导出SQL Server中的数据到Access数据库:SELECT * INTO OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="C:\A.MDB";User
ID=Admin;Password=;;Jet OLEDB:Database Password=88888888')...Products FROM PRODUCTS
从Access数据库导入数据到SQL Server:SELECT * INTO Temp_Table FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="C:\a.mdb";User
ID=Admin;Password=;;Jet OLEDB:Database Password=88888888')...PRODUCTS
先导入一个临时表,再处理。
这种方式速度很快,也可以导出表中的一部分数据,但是存在一个问题:如果SQL Server服务器和客户端机器不同,那么上述语句中的DATA SOURCE就是一个
网络地址,形如:\\WORKSTATION\SHAREDATA\A.MDB,而服务器和客户端未必已经建立文件夹共享,即使已经建立共享,不同的操作系统(如98对2000),访问共
享文件也很麻烦,很多时候需要人工干预(比方说,人工打开该共享文件夹),程序才能够访问到已共享的文件,这样对客户不透明,很麻烦。尽管可以通过API
函数来自动设置共享,但是我还没有找到什么办法自动打开连接(因为在通过OpenSource打开Access数据库时,实际上是从SQL Server服务器上访问工作站上的
文件,因此首先需要建立一个服务器到工作站的共享连接)。
4、当然,也可以通过SQL Server本身的复制功能,但是我没有试过,估计在Modem拨号的情况下,不大现实。
上面就是我能够想到的方案,提出来供大家讨论。