连锁系统数据同步的问题,高手请进(这是一个很实在的问题,个人觉得很难,提出来大家讨论)

Paul_yfx 2004-08-06 09:39:21
连锁管理系统一般都有一个总部,下面管理很多分部(可以是分公司或门店,就象沃尔马),这样就存在这样一个需求:所有分公司的业务数据(比方说,销售

数据)都要汇总到总部,便于总部进行业务分析;另一方面,基本信息(比如商品信息)必须在整个连锁系统统一,只能由总部录入,然后发送到各个分部,这

样就存在数据的发送和接收的问题,现在有以下几种方案:
注意:基于目前的国情,很多中小型的连锁系统不可能采用专线连接的方式,一般门店和总部采用拨号的方式,定时发送和接收数据
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拨号的情况下,不大现实。

上面就是我能够想到的方案,提出来供大家讨论。
...全文
209 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yijiansong 2004-08-27
  • 打赏
  • 举报
回复
编号分段!
zebulon 2004-08-27
  • 打赏
  • 举报
回复
up
DreamManor 2004-08-27
  • 打赏
  • 举报
回复
我现在对以下代码做一些优化:
============================================================================
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
============================================================================

优化后的代码如下:

rs.Open "c:\a.xml", , adOpenStatic, adLockReadOnly, adCmdFile

nRecCount = Rs.RecordCount
sBuffer = "INSERT INTO TABLE1 (FIELD1,FIELD2,...) VALUES ("

For i = 1 to nRecCount
connection.execute sBuffer & "RS.FIELDS(0).VALUE, RS.FIELDS(1).VALUE,...)
rs.movenext
Next i

rs.close
set rs = nothing

优化后的代码速度会快5%-30%


DreamManor 2004-08-27
  • 打赏
  • 举报
回复
我觉得第一种办法是最好的。
DreamManor 2004-08-27
  • 打赏
  • 举报
回复
学习
keiven 2004-08-27
  • 打赏
  • 举报
回复
学习。
bboos 2004-08-27
  • 打赏
  • 举报
回复
学习!~
tgc99 2004-08-17
  • 打赏
  • 举报
回复
关注一下.
huangyj 2004-08-17
  • 打赏
  • 举报
回复
数据同步确实是一个比较麻烦的问题,我们现在的一个系统也存在这个问题,还没有找到合适的解决办法,我们的数据库是Oracle与Oracle之间。还存在这中心下发数据时,不同的部门得到的数据是不一样的。
zyg0 2004-08-16
  • 打赏
  • 举报
回复
抛开sql-server用服务器或者客户端本地的ado的到记录集然后用winsock控件进行发送,我测试过
服务器是猫。3客户端同时读取大概10列10行数据然后接受添加到本地用了6秒
但是这个的难点是安全性问题和跨越公网,跨越公网可以解决,安全性只能通过加密和传送前的验证解决
Paul_yfx 2004-08-16
  • 打赏
  • 举报
回复
如果采用XML方式(即方案1),插入记录时速度确实较慢。eg:发送接收销售单据,一般是Master-Detail表结构,Master表保存单据的属性(如单号、日期、经手人等),Detail表保存单据明细数据,即销售的商品的信息。假如某一个超市,每天开5000张销售单,每张单平均4个商品,那么Master表有5000条记录,Detail表有20000条记录,这样接收时要执行二万五千次插入动作,在我的机器上(赛扬667,256M内存)需要20分钟,这是无法接受的
HenryXiaoY 2004-08-09
  • 打赏
  • 举报
回复
up
guxizhw 2004-08-09
  • 打赏
  • 举报
回复
第一种方法也还可以的,我个人认为,如果你晚上作一次,应该花不了多少时间。如果确认总部数据永远正确,分部数据必须跟总部一致
则在导入前,删除分部数据库中相同的记录即可
如:delete from 表 where field1=value1 and field2=value2 and ……
然后再insert into 表 (fields) values(……)
本人这么干的,不知道算不算愚昧?
cwm545 2004-08-09
  • 打赏
  • 举报
回复
哇,经典啊!
向你们学习。。。
apple800 2004-08-09
  • 打赏
  • 举报
回复
不懂,想关注就要顶!
熊孩子开学喽 2004-08-07
  • 打赏
  • 举报
回复
不懂就要顶!
cqm2099 2004-08-07
  • 打赏
  • 举报
回复
UP
online 2004-08-07
  • 打赏
  • 举报
回复
看我的,速度可以
服务端的数据库可以是sqlserver,也可以是access

vb+xml+asp
http://blog.csdn.net/online/archive/2004/07/07/35994.aspx
KJ_Wang 2004-08-07
  • 打赏
  • 举报
回复
为什么不用SQL的自己功能来做分布式的?介绍一招
用sp_linkedservers 连接到对方的机器
如果连通就用SQL语句读出来写进本地数据库就OK了,如果不懂再问我也不迟

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧