ADO Recordset在Cache模式下的状态维护问题? (300分)

P

pclover

Unregistered / Unconfirmed
GUEST, unregistred user!
这是一个常见但容易被忽视的问题,旧贴有问及但没答案,因此提高分数。
相信大家常这样使用Cache模式;

ADOConnection1.BeginTrans;
Try
ADODataSet1.UpdateBatch(arAll);
ADOConnection1.CommitTrans;
Except
ADOConnection1.RollbackTrans;
Raise;
End;
通常,用户会增加或修改多条记录然后保存,但是,当其中一条记录违反
数据库规则,这时会Rollback,然后提示错误,然后用户修改出错的记录,
然后再保存,这时会出现什么情况呢?(提示:除了用户刚修改的记录外,
其它记录的状态都变成了usUnmodified)

同样,把这个BUG推广到多表中:
ADOConnection1.BeginTrans;
Try
ADODataSet1.UpdateBatch(arAll);
ADODataSet2.UpdateBatch(arAll); // <- 假设出错,然后用户再改正
ADOConnection1.CommitTrans;
Except
ADOConnection1.RollbackTrans;
Raise;
End;

同样,DataSet1的修改会被忽略。
在Borland Newsgroup上,有TeamB的高手给出了SavetoFile,LoadFromFile的
解决方案,我觉得不是一个好办法,看看这儿大家有什么解决方法。
看来,BDE的两段提交(ApplyUpdate,CommitUpdate)比ADO好n倍啊。
 
今天看了MS网站,准备在下一版本中包含此功能,(Article ID: Q192717)
真是的,早就该向Borland大哥学习了。
不过,MS的文档支持要比Borland好的多,毕竟有Money啊。[:)]
 
ADO再其他许多方面都不如BDE
 
关注,除了用SaveToFile和LoadFromFile方法外,有没有别的方法使记录恢复到未执行更新前的状态?
 
pclover:
》》今天看了MS网站,准备在下一版本中包含此功能,(Article ID: Q192717)
》真是的,早就该向Borland大哥学习了。
你如果使用ADO+BDE的话,那么体现不了ADO的优越性,如果使用ADO(原生) 、COM+的话,
那么ADO就比BDE好多了。

 
我的意思是期望ADO提交时也两段提交啊,这并不影响ADO的性能吧。
据我所知,BDE,还有PowerBuilder的DataWindow,都采用这种技术,
MS开始为什么不考虑,这时候才开始考虑呢。
 
这个功能可能不好用,是否可以用Store Procedure的Transation来处理,这样性能也能有所提高。
 
to Adnil,
不明白,能否详细点,Master/Detail中要保持同步,Detail必须用Cache啊。
 
提前,欢迎大家谈谈,难道大家不用Cache功能么?
 
我在使用ado时候,如果添加多条记录,(用adoquery.append)然后用cancelbatch时候就出错了。
但如果添加一条记录,是可以的。修改、删除多条记录用这也没有问题。如果添加多条记录,然后用
updatebatch是正确的,不知道为什么?请各位帮忙,我的贴没有人回答!pclover,谢谢!
 
我已答。还有问题再探讨。
 
是啊,我也被这个问题搞得焦头烂额,最后不得不尽量在提交之前将所有可能的异常抓出来.
否则,如果让后台出问题再rollback,嘿嘿,死定了.
 
确实是有这个问题,后来整得我没办法,只好把所有的事务移到后台了,如果一定要在前端
处理事务的话,我就在客户端使用ClientDataSet。象下面一样:
ADOConnection1.BeginTrans;
Try
if ClientDataSet1.ApplyUpdate(0) > 0 then Abort;
if ClientDataSet2.ApplyUpdate(0) > 0 then Abort;
ADOConnection1.CommitTrans;
Except
ADOConnection1.RollbackTrans;
Raise;
End
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
761
DelphiTeacher的专栏
D
顶部