使用ADO+DataSetProvider+ClientDataSet连接共五个客户端,每个客户端都有一个DBGrid来显示数据,当其中一个客户端新增或修改了数据提交后,其他的客户端都得不到该数据的修正。除非手动CLOSE、OPEN 等动作。小弟初学多层的数据库以及多客户端,比较迷茫,不知要如何才能自动更新到其他客户端的DBGRID,实现同步??

解决方案 »

  1.   

    使用DataSnap2010来连接
    服务端使用DSTCPServerTransport
    客户端使用DSProviderConnection
      

  2.   

    数据量不是很大的话,可以考虑显示的部分用timer事件刷新一下。
      

  3.   

    用TIMER刷新是可以实现,但如果设置的时间长,就起不到实时的效果,时间短了,又不太现实。
      

  4.   

    查了一些资料,有些认为服务器端通过UDP通讯广播通知其余客户端刷新数据,让客户端接收指令后进行“刷新”。
    难道只有通过客户端主动去刷数据的方法吗??没有方法让服务端主动向客户端推数据吗?
      

  5.   

    将datasetprovider 的options下的popropogatechanges=true;poautorefresh=true即可实服务器的所有变化自动返回到clientdataset中,这个方法有人说可以,也有说不可以。到底可以吗???
    最近有外,这段时间都无法测试验证一下,有试过的朋友,请留言,谢谢!!
      

  6.   


    就算这个方法是可以的,也就是一个 Timer。
    除非服务器端维护 5 份数据。(跟Client界面上显示的一模一样)。
    然后,哪个数据要变化,就按某个规则推送 Client 变更这个值。
    没有镜像文件,哪里来的“实时”?!byw,UDP的话,你也需要考虑是否丢包。更复杂。
      

  7.   

    如果服务端向客户端送数据,那么,服务端就要是有状态的(需要保持每个客户端当前数据的状态以决定如何向客户端送数据),这种方式,如果客户端很少,那没问题,如果多了,服务端会承受不了。现在的应用模式,都是向服务端无状态的方式演化,因此才是状态信息在客户端,客户端需要数据的时候主动向服务器请求的方式。你所说的要求,可以采用在服务端单独做个服务程序,用来通知客户端数据的变动(像你说的udp广播也是一种方式),然后由客户端向服务端请求数据。
    当然了,你完全可以将数据的变动信息放在udp广播中,这样客户端接到广播通知后直接刷新本地数据就是了。
      

  8.   

    如果用普通的MIDAS三层的话,一个客户通知服务去刷新其它客户的操作,相对于这样的接口不是很好实现,
    首先:你可以借用TUDP或TTCPSOCKET来进行。本来用TSOCEKETCONNECTION做客户端连接话,同样可以回调用一个接口来引发,不过效率可能不是很好。其次用第三方实现的三层,如REMOBJECT。本身就有TEVENT控件,可以很好的实现C-S,S-C之间的通迅。对于TDCOMCONNNCTION这种模式的话,未试过。
      

  9.   

    比如ltOptimistic 独立模式(与原来结果集对照,如果在此期间其它用户修改了结果,则你的结果不能保存)
      

  10.   

    修改某条数据的时候,一定要取它在数据库的内容。而不是残留在界面上的东西。加"立即刷新"timer定时刷新(时间可稍长一些, 如20分钟)这几条加到一起, 就可以了. 兼顾用户体验与编程复杂性. 
      

  11.   

    UDP
    通知服务端有更改
    服务端广播之
      

  12.   

    UDP
    通知服务端有更改
    服务端广播之
      

  13.   

    综合各方面考虑,最终还用通过IDTCPSever/IdTcpClinet通信,客户端收到特写信息进行刷新,感激大家提供宝贵的意见与经验,谢谢!!!
      

  14.   

    补充下:除了IDTCPSever/IdTcpClinet通知客户端刷新外,还同时用IDTCPSever/IdTcpClinet通信将一些简单的数据通过记录方式发送到客户端。