奇怪的Clientdataset ( 积分: 300 )

  • 主题发起人 yeskert1
  • 开始时间
Y

yeskert1

Unregistered / Unconfirmed
GUEST, unregistred user!
朋友们,我发现这样的现象:
假设cds1-->prvdr1-->adoquery1,cds2-->prvdr2-->adoquery1。
adoquery1的connection已经设置好已经连接好,它的sql是空的,它当然也是关闭的。
cds1.commandtext的内容是select * from test,这是合法的、可疑返回结果集的。
cds2.commandtext的内容为空。
我感到奇怪的是,只要cds1曾open过(之后关闭与否都一样),那么cds2就能open,并且得到与cds1曾得到的数据一样。
这是为什么呀???我觉得它应该产生异常才对呀!(因为adoquery1是关闭的)
现在搞的我自己要发现这种情况,自己去引发异常。
 
这有什么奇怪的? 你这不该这样用, 服务端和客户端应该分别独立
 
为什么要用两个呢,只用一个不行吗,用完就释放,那不是最简单不过的,有时搞和复杂了,反而自己都会糊涂。
 
推测造成这样的原因是 CDS2的 providername 还是 Prvdr1, 一般造成这样的原因是在编程的时候,大家在放置为 CDS1, PRVDR1, ADOQUERY1并设置为连接后,第二个都喜欢直接复制 原来的CDS1, PRVDR1,ADOQUERY1, 控件的名称会自动变为 XXX2,但此处DELPHI有一个BUG,就是PRVDR的DATASET 与DATASOURCE 的DATASET都变为了 XXX2,但就是CDS2的RPOVIDERNAME还是指向了PRVDR1,并不会自动改变,所以在大家理受当然的认为正确的时候, 其实数据还是变成了 CDS2->prvdr1->adoquer1
LZ检查一下,是不是这样的原因
 
to htw、tianxin7131:
没办法,这是实际应用的实际情况,我为了和大家讨论才简化成这样子;
to levi、tianxin7131:
即便是同一个prvdr,这样也是有问题啊!cds2凭什么能获得cds1最后一次的结果啊!
 
简单的说,PRVDR最终得到的就是一个 OleVariant 类型的一个包(即prvdr.data),而对于CDS来说,即使没有任何的数据源,只要给 cds.data一个正确格式的数据包,就可以打开并看到数据,跟直接从 文件里装载数据是一个道理,所以看到PRVDR1的数据并不奇怪。
 
to levi:
prvdr2给cds2的那个数据包从哪里来?它是不知道prvdr1存在与否的,它只知道adoquery1,而adoquery1是关闭的,且sql是空的,这个数据包“缓存”在何处?
如果这个问题不解决,中间层的安全就收到威胁了。
 
我的意思是你看一下 CDS2 的 provinderName 到底是 Prvdr2 还是Prvdr1, 还有 prvdr2的DataSet 是 adoQuery1 还是 AdoQuery2 按理说,如果不是设置错误,是不可能出现上述结果的 这个跟软件合不合理根本没关系。
 
to levi:
prvdr2的dataset是adoquery1,不存在adoquery2,就是说prvdr1和prvdr2都指向adoquery1。
开始时,cds2的provinderName是prvdr2,有这样的问题,刚才我干脆让cds2的provinderName为prvdr1,结果仍然这个问题。
 
各位朋友,请帮菜鸟一把!
 
cds1-->prvdr1-->adoquery1,cds2-->prvdr2-->adoquery1。
肯定是你的关联错了,不然就是你的ADOQuery1已经是open状态。
你认真检查,不可能出这个问题的。我用了很多,从来没有出现这个问题,你可以open ClientDataSet时,先把ADOQuery1关闭一下。
 
我試了一下。會出錯:
commandtext changes are not allowed
不知道你是怎麽設置的。
 
to willing66:
你可以试试!我也用这玩意多年,今天才发现这个问题。
顺便说一下,我的delphi是7.1。我想这应该是一个稳定的版本。
 
本来如此
 
怎么个“本来如此”?
 
cds1-->prvdr1-->adoquery1,cds2-->prvdr2-->adoquery1
这样的设置,决定于:prvdr1是什么状态,如果它是长连接状态,打开了cds1,意味adoquser1是打开的,你可以这样测试:观测adoquery1是否是打开或关闭状态.
另一种情况:你打开cds1后,就打开cds2就会有数据的.这之后你Close了cds1,cds2同样有数据的.这就是因为:Clientdataset建立于内存上的.正因为这样才有其特色
 
我在open cds2之前,报cds1关闭,同时把adoquery1也关闭,之后才打开cds2的。cds2仍然能得到cds1最后一次得到的数据。
这种情况也正常吗?
 
cds2.data:=cds1.data;
 
看来这是一个bug!
但是,如果是外部provider可能没问题。
 
yeskert1:
您还在做三层的系统吗,如果有兴趣和我交流一下,请和我联系
MSN:wang.hui@hotmail.com
 
顶部