两层结构,两个问题

loujing 2007-02-24 08:06:02
SQL Server2000,
服务端是RemoteDataModule + ADOConnection + DataSetProvider
客户端是SocketConnection + ClientDataSet,问题如下:
1,A客户增加了一条记录,怎么让B客户那里马上显示,难道一定要放个Timer定时刷新?
2,A在修改或者删除一条记录,B也在修改或者删除同一条记录,这里的异常是怎么处理的?

请大家能具体放点代码,谢谢了。
...全文
227 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dabaicai 2007-02-27
  • 打赏
  • 举报
回复
首先,如果用你的方法的话,界面是不能用数据集操作控件,像DBEDIT,DBGRID,因为你在里面修改数据的时候直接修改到数据库了。
按你的做法,就是用户新增或修改了数据,点击保存,随即发送一个操作消息到服务器,服务器向其他各个客户端再发送消息来刷新,那么,如果很多人都在新增或修改数据的话呢?? 特别是你这边正在修改而另外一边却已经发送了刷新的消息来了(或同时修改一条记录),你如何处理??(当然,这个可以考虑用锁来解决,但问题是当一个人点击修改某条记录,却迟迟没有点击保存,那么其他的人就都不能再处理该数据了),所以建议用定时刷新,比如客户端每5秒,adoquery.requery一下就可以了
kongfancheng 2007-02-27
  • 打赏
  • 举报
回复
这个就涉及到Transaction的问题了。当你修改了一条记录后,该记录即被锁定,直到Transaction被commit。在锁定期间,其他客户端如果要修改该记录,则会抛出异常。
loujing 2007-02-27
  • 打赏
  • 举报
回复
希望dabaicai能继续解释一下。
loujing 2007-02-27
  • 打赏
  • 举报
回复
to dabaicai,adoconnection也会遇到同步刷新或者修改删除同一条记录的问题啊。

to kongfancheng,目前是用socket,然后当A用户增加了一条记录,SocketServer向所有SocketClient群发一个消息,通知它们刷新。
kongfancheng 2007-02-26
  • 打赏
  • 举报
回复
如果是InterBase/FireBird数据库,则可使用Event。MSSQL没有这功能。
不换数据库,则恐怕得自己写一个Socket机制来干这个,或者用timer。当然,也可用dcom的push特性,在服务器端注册一个Event Sink,不过这么做也不简单。
dabaicai 2007-02-26
  • 打赏
  • 举报
回复
一般情况下是定时刷新或者放按钮手动刷新2选1
不过你既然是2层的做成这样是不是有点复杂化了,直接用adoconnection连数据库做不行?
loujing 2007-02-26
  • 打赏
  • 举报
回复
再顶一下,望详细解释。
ZyxIp 2007-02-24
  • 打赏
  • 举报
回复
是到用SOCKET的时候了.

在服务器对所有的数据操作和用户进行统一管理,在操作数据的时候对对应的访问用户进行同步.

不过一般不要这样同步,因为会造成用户当前显示的数据列表突然变化.还是象IE一样放个刷新按钮比较好.

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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