zoukankan      html  css  js  c++  java
  • 关于ADO一个容易被忽视的问题!UpdateBatch [问题点数:0分]

    这是一个常见但容易被忽视的问题,旧贴有问及但没答案,因此提高分数。
    相信大家常这样使用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的
    解决方案,我觉得不是一个好办法,因为LOADFROMFILE之后这个记录集的COMMANDTEXT都变成那个文件名了,
    CommandType:=cmdfile了,如果SQL里面用了参数,那就很麻烦了!

    看看这儿大家有什么解决方法。在发贴时,我在考虑用CLONE解决这个问题!

    看来,BDE的两段提交(ApplyUpdate,CommitUpdate)比ADO好n倍啊,不知道BORLAND为什么要放弃他!

  • 相关阅读:
    WSDL
    对协程的理解
    调用webServer
    待看
    BZOJ4668 冷战(并查集)
    BZOJ4651 NOI2016网格(割点)
    Lyft Level 5 Challenge 2018
    BZOJ3073 PA2011Journeys(线段树+bfs)
    BZOJ4602 SDOI2016齿轮(搜索)
    BZOJ4597 SHOI2016随机序列(线段树)
  • 原文地址:https://www.cnblogs.com/jijm123/p/10327631.html
Copyright © 2011-2022 走看看