共享DataSetProvider的问题 ( 积分: 200 )

  • 主题发起人 king.gray
  • 开始时间
K

king.gray

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器端有一个DataSetProvider
有两个客户端ClientDataSet同时联接到服务器端的DataSetProvider
A客户端:Select * From 表A
B客户端:Select * From 表B
A客户端:ClientDataSet.Refresh时取到的数据是“表B”的数据
请问如何处理这样的共享冲突问题
本人刚接触三层结构,思维还是两层的思维,也请兄弟们能推崭一些好书学习一下。
谢谢!
 
不会冲突的, 每个客户端连接服务器时,都生成对应的remote data module.
将近3年不用delphi了, 忽然近来,恍若隔世阿。
小伙子,换C#吧
 
不可能,查查是否有其它地方出问题。
 
设2个DataSetProvider
 
To:All
谢谢各位的参以
我做了一个最简单的程序作过测试。
环境如下:
服务器端:DataSetProvider, SockConnection
客户端:ClientDataSet,
同时打开两个客户端:
A先Select * From A表
B再Select * From B表
A.Refresh时DBGrid中显示的就成了B表数据。
这个是我试验的结果,只是我不知道要如何避免这样的情况发生,有什么设置.
 
A.Refresh时先设置A的clientdataset.commandtext:='Select * From A表'
 
会冲突的!
如果这两个cds是一个客户端里面的,就有可能冲突。
provider在“无命令请求”(空sql下的open和refresh)时,将最后一次缓存的数据返回。
其实它不该缓存数据!!这是midas的一个bug。
 
不会吧,是无状态的缓存做什么,浪费资源.怎样做才能不缓存呀
 
你是不是采用多线程的,那应该不会有问题
 
特别说明:我是将provider和cds放在同一个应用里时出现这个问题的!我没有更进一步验证是否真实环境中provider放在服务器端是否也这样,呵呵~
我的问题的简化为:cds1和cds2都指向provider1,provider允许命令。
动作1:
cds1.commandtext:='……';
cds1.open;//用户可以看到数据了
...
cds1.close;
cds1.free;// :)为了保险,为了消除怀疑
动作2:
cds2.commandtext:='';//让它空着
cds2.open;//你相信否?这时得到cds1曾经得到的数据
我想尽办法也不能避免这种现象。
我理解的是,provider有缓存。
 
可能缓存的是命令而非数据。
 
看看,学习学习。
 
是你的后台的DATASET 或 ADOQUERY保存了最后一次查询的命令
cds2.commandtext:='';//让它空着
cds2.open;//你相信否?这时得到cds1曾经得到的数据
这时,cds2.commandtext:='',DATASETPROVIDER不传空,但是ADOQUERY中有最后一次的查询命令。所以cds2.open就查到最后一次查询的数据。给分吧
 
To All:
我需要的是解决这个问题的方法,我只是举个最简单的例子.
碰到更新数据也会有这样的问题,会导致更新失败,请做过三层的朋友谈谈吧.
 
应改会冲突..
 
多人接受答案了。
 
顶部