多层分布式数据上传更新问题(高分200) ( 积分: 200 )

  • 主题发起人 主题发起人 weir1999
  • 开始时间 开始时间
W

weir1999

Unregistered / Unconfirmed
GUEST, unregistred user!
情况是这样的,我现在做超市前台的POS,我是先把客户端前台POS的单据先保存在本地数据库(因为数据发生非常频繁,不可能用实时提交的方式),然后再从本地数据库读取数据提交给服务端,我现在是用ADOQuery先读取本地数据,然后再用ClientDataSet循环Append,把ADOquery数据导到ClientDataSet,这样就生成了ClientDataSet.Detla,然后再进行提交,但是这样出现了一个问题了,就是已经提交过的数据再提交就会造成重复,如果在数据库设置关键字,如果存在重复的话就所以的数据就不能提交了
求高手指点一下,怎么解决这一问题,或有更好的办法?
 
情况是这样的,我现在做超市前台的POS,我是先把客户端前台POS的单据先保存在本地数据库(因为数据发生非常频繁,不可能用实时提交的方式),然后再从本地数据库读取数据提交给服务端,我现在是用ADOQuery先读取本地数据,然后再用ClientDataSet循环Append,把ADOquery数据导到ClientDataSet,这样就生成了ClientDataSet.Detla,然后再进行提交,但是这样出现了一个问题了,就是已经提交过的数据再提交就会造成重复,如果在数据库设置关键字,如果存在重复的话就所以的数据就不能提交了
求高手指点一下,怎么解决这一问题,或有更好的办法?
 
有没有人帮一下
 
我以前做过两次这样的程序.
第一种做法是把增加或修改过的数据保存在本地的同时,也保存入一个Xml文件中(其中保存表名,数据以及所要进行的操作,这要看你如何定义xml格式了),在应用服务器端写个函数来接收XMl并解析插入服务端数据库,最后删除本地xml文件。
第二种做法是在本地表中增加一个数据位用业表示所进行的操作,0表示已上传,1表示增加,2表示修改,3表示删除,然后在应用服务端写个接收函数(这种方法写成通用的会麻烦一点)。
 
我现在主要的问题是,如果提交已经提交过的记录的话,就会造成记录的重复,如果用循环的控制的话,由于数据量的庞大要花费大量的时间,觉得不太实用
能否在ClientDataSet或DatasetPrivoder更新数据时控制?而且不是用循环一条记录一条记录来控制?
或能有其它的解决方案的,不一定得Midas的?
 
weir1999:你说的是对的
建一个关键字,
然后用
create procdure 导入
as
insert into 服务器表名 select * from 本地表名 where 关键字 not in (select 关键字 from 服务器表名)
go
 
可是我本地是用Access数据库啊,而且像你那个两个数据库之问也要先连接啊,行不通
 
直接就用clientdataset,省掉access可以吧?
 
用clientdataset直接保存到XML文件就可以,沒有必要用ACCESS。
因為你的程序已經是三層架構了,用XML做數據庫有許多優點。
 
把本地没上传上的数据生成一个数据库文件,标记原本地数据库,压缩,检查服务器端数据是否有该项段数据,上传,在服务器端释放导入,服务器端记录本段数据的标志!
 
我觉得就像 sun_8113 所说的,搞一个标志,来标志下面数据的状态就可以,那个状态是需要传的你就直接找出来传一下就可以了,怎么还要搞得那么复杂干吗?
 
用触发器吧,插入是检查是否已经有了
 
最简单的方法:
1:加多一个TDataSetProvider控件,将其指定AdoQuery,然后在AdoQuery.Open之后
使用TClientDataSet.Data = TDataSetProvider.Data方法即可。这样不会产生日志
//完成将数据读取到ClientDataSet操作,但同时又不产生ClientDataSet的日志
DataSetProvider1.DataSet := AdoQuery1;
AdoQuery1.Open;
ClientDataSet1.Data := DataSetProvider1.Data;
//对数据进行编辑操作
ClientDataSet.Insert,Update,Delete.......
//提交,与常规一样 (这时初始获取的数据一定不会出现在提交中<因为日志中没有>)
ClientDataSet.ApplyUpdate(..);
如果还会有重复的数据,说说你的提交方式
 
后退
顶部