SQL Server2000,
服务端是RemoteDataModule + ADOConnection + DataSetProvider
客户端是SocketConnection + ClientDataSet,问题如下:
1,A客户增加了一条记录,怎么让B客户那里马上显示,难道一定要放个Timer定时刷新?
2,A在修改或者删除一条记录,B也在修改或者删除同一条记录,这里的异常是怎么处理的?请大家能具体放点代码,谢谢了。

解决方案 »

  1.   

    是到用SOCKET的时候了.在服务器对所有的数据操作和用户进行统一管理,在操作数据的时候对对应的访问用户进行同步.不过一般不要这样同步,因为会造成用户当前显示的数据列表突然变化.还是象IE一样放个刷新按钮比较好.
      

  2.   

    一般情况下是定时刷新或者放按钮手动刷新2选1
    不过你既然是2层的做成这样是不是有点复杂化了,直接用adoconnection连数据库做不行?
      

  3.   

    如果是InterBase/FireBird数据库,则可使用Event。MSSQL没有这功能。
    不换数据库,则恐怕得自己写一个Socket机制来干这个,或者用timer。当然,也可用dcom的push特性,在服务器端注册一个Event Sink,不过这么做也不简单。
      

  4.   

    to dabaicai,adoconnection也会遇到同步刷新或者修改删除同一条记录的问题啊。to kongfancheng,目前是用socket,然后当A用户增加了一条记录,SocketServer向所有SocketClient群发一个消息,通知它们刷新。
      

  5.   

    希望dabaicai能继续解释一下。
      

  6.   

    这个就涉及到Transaction的问题了。当你修改了一条记录后,该记录即被锁定,直到Transaction被commit。在锁定期间,其他客户端如果要修改该记录,则会抛出异常。
      

  7.   

    首先,如果用你的方法的话,界面是不能用数据集操作控件,像DBEDIT,DBGRID,因为你在里面修改数据的时候直接修改到数据库了。
     按你的做法,就是用户新增或修改了数据,点击保存,随即发送一个操作消息到服务器,服务器向其他各个客户端再发送消息来刷新,那么,如果很多人都在新增或修改数据的话呢?? 特别是你这边正在修改而另外一边却已经发送了刷新的消息来了(或同时修改一条记录),你如何处理??(当然,这个可以考虑用锁来解决,但问题是当一个人点击修改某条记录,却迟迟没有点击保存,那么其他的人就都不能再处理该数据了),所以建议用定时刷新,比如客户端每5秒,adoquery.requery一下就可以了