有关ClientDataSet共用DataSetProvider的问题(100分)

  • 主题发起人 主题发起人 kingbc
  • 开始时间 开始时间
K

kingbc

Unregistered / Unconfirmed
GUEST, unregistred user!
一般的ClientDataSet都会与一个DataSetProvider相连接
但是现在有两个ClientDataSet或多个共用一个DataSetProvider,因为在二层中
TQuery是经常动态创建的,因此我现在也需要动态创建ClientDataSet.
可问题是,第一个ClientDataSet打开时是正常的,可第二个ClientDataSet再执行时
它便会把DataSetProvider连接的ADOQuery关掉了,
而第一个ClientDataSet的数据也就没有了??
 
所以,在这种情况下,你实际上需要服务器为你提供一个无状态对象。即Provider可以给你
所有的ClientdataSet使用。因此,在这种情况下,你不需要把ClientDataSet绑定到Provider上
而是需要手工查询数据,返回后传给你ClientDataset即可。ClientDataSet的功能之一就是
可以把数据缓存在本地啊。
 
楼上说的对,当数据从应用层读过来时(当然在读完的),那个 Provider 就可以被别的
ClientDateSet 利用了,其实和Query 没什么区别
 
To proman
可否把你的想法讲清楚一点,你的意思是不是这样子:
比如说一个客户端界面有一个ClientDateSet,那么是不是在窗体创建的时候动态的设定
它的provider属性,然后在窗体的close事件把它释放掉?
但如果多个用户同时操作这个界面呢?
 
to Afei1
他们的意思不是那样。建议你看一下李维的多层的书
 
To afeil
不是啦,你根本不需要把ClientDataset绑定到Provider上。你在你的服务器上开个方法可以
给客户端返回数据。当你的客户端的ClientDataSet需要数据时,就调用你的服务器的方法,让你的
服务器去调用Provider把你的数据取得再送给你。你收到数据后可以把收到的数据直接给ClientDataSet
即可,如果是要添加的话也可用ClientDataset的AppendData方法。总这返回的这个数据是一
个记录集,封装在了一个Variant中。你可以对它进行任何兼容处理。这样k只要客户端需要
数据就去调用服务器的方法,而不是绑定到Provider上。建议你好好看看ClientDataSet的帮助
Midas的关键就是它了。写三层的话,李维的书是必看的。
 
楼上兄台讲的完全正确!
从服务器取得数据后,把它送给Tclientdataset.data,之后你可以进行任何形式的处理,需
要更新时把Tclientdataset.delta送给服务器中的相应过程.当然,取数和更新的过程要你
自己写.
 
可以利用Pooling的技术来解决该问题,因为每一次访问应用服务器时,都是独占访问一个
RDM,根本不会发生冲突。用该方法是可以解决只是用来查询的ClientDataset,但是如果是用
在有更新动作的数据集则不行。可以考虑用ClientDataset.CommandText的方法来解决。
在M/D关系中也必须要用CommandText的方法。
 
正在研究,听课先
 
你的应用观念有问题,
一般地一个ClientDataSet都会与一个DataSetProvider相连接
临时的才可以多个ClientDataSet与一个DataSetProvider相连接
这样数据才不会丢,
因此,你要有固定和临时的DataSetProvider两种才对!
固定的用于连接固定的ClientDataSet,数据才有保证
一般一个大程序中,有1-5个临时的DataSetProvider与一些临时的ClientDataSet的
相连接才能使程序正常运行!

 
先谢谢proman
这几天我看了李维写的哪本5.x系统篇,感觉你那样做才是比较根本的解决方法。
 
多人接受答案了。
 
后退
顶部