SQL数据同步问题(100)

  • 主题发起人 主题发起人 杨子
  • 开始时间 开始时间

杨子

Unregistered / Unconfirmed
GUEST, unregistred user!
N工作点和一个中心服务器的SQL数据库数据库表结构是一样的工作的数据上传到中心中心再转发到各个工作点如何实现呢?就是要做各个工作点数据库数据是一样的
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=13248
 
不知道你站点是否可以直接连接中心服务器,也不知道分点上传新增的数据到中心后,是否还有其它数据需要处理,更不知道是否存在修改的数据也要上传到中心。下面说功能最简单的上传方法,前提是数据需要能够区分出来是哪个站点产生的。----------------------------------------------1.所有站点向中心上传完数据后,才可以从中心下载数据2.站点A向中心上传数据时,先查出当天本站点新增的数据到Query1(ADOQuery1); 然后通过Query2查询中心服务器中A站点当天的数据,目的是为了防止数据重复上传。 循环Query1中记录,并根据主键字段值,检查每条记录是否在query2中出现,如果query2中出现, 说明该数据已经上传,不需要处理,否则就需要insert到中心数据库。 依此方法处理各个需要上传的数据表3.待所有站点上传完成后,开始从中心下载数据。 query1查询本站点数据库中的数据,且不是本站点产生的数据,而是其它站点产生的数据 query2查询中心数据库中的数据,且不是本站点产生的数据, 因为对于本站点产生的数据,上传到中心后,是不需要再下载回来的。 循环query2中记录,并根据主键字段值,检查每条记录是否在query1中出现,如果query1中出现, 说明该数据已经下载,不需要处理,否则就需要insert到本地数据库。------------------如果两者不能联网,则需要通过类似方法,把查询出来的数据导出到一个外部文件中,你给的信息太少,分也不是很多,不多说了
 
工作点与中心服务的网络是通的但是就因为有的时候会断开所以需要先把信息存到本地数据库然后上传到中心去,再进行同步znxia,你这样的做法我也知道现在这样一条的去插入,不是会很慢,而且很耗资源有什么更好的办法吗?
 
工作点与中心服务的网络是通的但是就因为有的时候会断开所以需要先把信息存到本地数据库然后上传到中心去,再进行同步znxia,你这样的做法我也知道现在这样一条的去插入,不是会很慢,而且很耗资源有什么更好的办法吗?
 
想速度快?没问题。1>在本地将需要上传给中心的数据,导出到一个文本或者dbf文件中,方法可以通过下面的经典帖子来查找 http://www.delphibbs.com/delphibbs/dispq.asp?lid=16919662>在服务端建立一个数据交换表,接收站点数据前,使用trunc命令将数据清空,然后通过上面的帖子里的方法,将站点数据导入到交换表中。3.通过一个sql语句,将交换表中的数据插入到正式表中,注意对于中心站点已经存在的数据,不要重复插入。---------------------当然也可以通过sql将数据直接插入到服务端的交换表中:INSERT INTO AB.dbo.AASELECT *FROM OPENROWSET('SQLOLEDB','远程主机名或IP地址';'用户名';'密码', 'SELECT * FROM AB1.dbo.AA1') AS A;说明: AB.DBO.AA --> 本地数据库.用户名.数据表名 AB1.dbo.AA --> 远程的数据库名.用户名.数据表名
 
SQL Anywhere 好象就同步功能,可以去购买专业工具.如果不想购买专业工具,就得投入成本自己开发(要有思想准备,不是那么简单就能容易做好的,其过程中,很多问题要考虑).
 
数据同步问题。专业的工具最好,但贵。业余的工具没有,自己写,但贱。稳定性、同步方法、效率都是要考虑的。以前做过,同步方法是最关键的。想做好,不容易的。
 
异构数据库之间完全可以用SQL语句导数据。大家抛弃BatchMove吧 如果觉得好请Up一下,如果觉得不好也请Up一下告诉你一个最快的方法,用SQLServer连接DBF在SQLServer中执行SELECT * into bmkFROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="e:/share";User ID=Admin;Password=;Extended properties=dBase 5.0')...bmk这样就可以把e:/share中的bmk.dbf表导入到Sqlserver中,速度是最快的上面这个方法DBF文件必须在服务器上,如果DBF不在服务器上,就用连接串Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/temp;Extended Properties="dBase 5.0;";Persist Security Info=FalseSQL语句SELECT * into aaa IN [ODBC][ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;] from aaa这是直接把客户端上的DBF传上服务器的最直接方法。把压箱底的方法都告诉大家在Form上放一个ADOConnection,连结指向目标Access库比如txt文件在c:/temp/aaaa.txt就执行ADOConnection.Connected := True;ADOConnection.Execute('Select * Into abcd From [Text;Database=c:/temp].aaaa.txt');就一切Ok了,这个方法一定行的,我好不容易才研究出来的有了这两个例子,异构数据库之间导数据的问题就举一反三,迎刃而解了。把Excel导入到Access中,同txt类似select * into <table name> from [excel 8.0;database=<filename>].[<sheetname>$]我最讨厌别人用BatchMove导数据了,明明一个SQL的事情,偏要。。。我的目标是让大家抛弃BatchMoveProvider=MSDASQL.1;Extended Properties="Driver={Microsoft Visual Foxpro Driver};SourceType=DBF;SourceDB=你的文件所在路径;" 这是我拷贝一个大师级别人物的。嘿嘿。。发你一下看看吧
 
insert test..PCardNum select * from OPENDATASOURCE(''SQLOLEDB'',''Data Source=10.0.0.7;User ID=yh;Password='').test.dbo.PCardNum大家觉得这个方法怎么样
 
原则上是可行的,但要在insert之前先把本地的test表清空,还要注意有无自增字段。最最重要的千万不要忽略业务数据的传输方向性。
 
各位在发言之前,先看看 二楼 znxia 的帖子,生成数据包后入库,是一部分工作。但如何生成数据包?这个工作谁来做,如何做?如何能准确的抓取最新的数据?各位亲自试试,触发器吗?时间段?谁有好的建议?
 
haidy你所说的最重要的千万不要忽略业务数据的传输方向性是什么意思,能解释下吗?继续研究中……
 
如果有些业务数据是在工作点生成的,另一些业务数据是在服务器生成的,那就要注意方向性了。例如某些数据是在工作点C1生成,并上传到服务器上,那么服务器转发给各个工作点时就应该避免又回传给C1。还有要约束同时修改某项纪录的情况,通过业务逻辑,尽量避免,例如某些表(或某类纪录)应该由工作点C1生成/修改,其他工作点就不可以改,等等
 
学习中……………………
 
接受答案了.
 
后退
顶部