MasterDataset:Tadodataset;
DetailDataset:Tadodataset;Masterdataset对应着主表
DetailDataset对应着子表Masterdataet,DetailDataset的LockType为ltBatchOptimistic,其他的均为默认设置以下代码:
   Connection.BeginTrans;;
try
   Masterdataset.UpdateBatch(arall);
   DetailDataset.UpdateBatch(arall);
   Connection.CommitTrans;
except
   Connection.RollbackTrans;
end;当DetailDataset的数据违反主键约束。为什么保存发生错误时没有发生事务的回滚呢。
也就是说Masterdataset和Detaildataset中的一部分数据被保存进了数据库,百思不得其解。
个人感觉这里的事务控制好象根本没有起作用一样,如同空设;
请大虾指教。

解决方案 »

  1.   

    在beforepost中写下dataset1.begintrans
    在afterpost中写下dataset1.committrans
    再试试看
      

  2.   

    在beforepost中写下dataset1.begintrans
    在afterpost中写下dataset1.committrans
    再试试看
    ------------------------
    to  DragonBill
    请问
       Connection.BeginTrans;;
    try
        ..............
       Connection.CommitTrans;
    except
       Connection.RollbackTrans;
    end;
    还要吗?
    请继续解答
      

  3.   

    不对啊,应该这样吧:Connection.BeginTrans;
    try
       Masterdataset.UpdateBatch(arall);
       DetailDataset.UpdateBatch(arall);
    except
       Connection.RollbackTrans;
       exit;
    end;
    Connection.CommitTrans;如果把Connection.CommitTrans;放在exceppt前面,那不是不管怎样都提交了嘛。
      

  4.   

    hehe,8341 要努力啊Connection.BeginTrans;
    try
       Masterdataset.UpdateBatch(arall);
       DetailDataset.UpdateBatch(arall);Connection.CommitTrans;
    except
       Connection.RollbackTrans;
       exit;
    end;
      

  5.   

    dm.adoconnection1.BeginTrans;
       try
      BEGIN
          dm.adoconnection1.CommitTrans;
      except
        dm.adoconnection1.RollbackTrans;
      end;
      

  6.   

    UP可能没有运行except那段代码吧。。你跟踪一下确认。。
      

  7.   

    不懂ADO想问问,Masterdataset和DetailDataset的Connection是同一个吗?
      

  8.   

    不懂ADO想问问,Masterdataset和DetailDataset的Connection是同一个吗?-----------------------
    是的
      

  9.   

    分别看下Masterdataset和Detaildataset的相关事件中有没有做特别的处理 比如OnPostError中.....
    最好是单步跟踪看看有没有,看看保存主表数据是不是 执行connection1.CommitTrans,导致的
      

  10.   

    本人觉得好象是Delphi的问题,我觉得我的代码不应该有错
      

  11.   

    我虽然不懂ADO,不过用ADO的人多了,而且Master/Detail都是很基本的东西了先怀疑自己的代码吧
      

  12.   

    先找出POST数据库的所有的可能 然后再逐一分析
      

  13.   

    你用SQL语言操作数据库试试吧。不要用Delphi的东西向数据库里写东东(速度慢)。
      

  14.   

    我觉得是Delphi的问题,我把自己的代码问过一些很有经验的人,他们都不知道是什么回事。现在我写一个控件,是把改变的数据变成SQL直接操作数据库的,完成后,我告诉大家。
      

  15.   

    事务处理格式如下:begintrains;
    try
      .....
      Execsql;
      if errors.count = 0 then
        committrains
      else
        rollbacktrains;
    excetp
      rollbacktrains;
    end;
      

  16.   

    有时,execsql执行的时候,有些错误是无法扑捉到的,so用errors.count来扑捉!
      

  17.   

    可问题TMD的,他就是第一次回滚,第二次就不回滚了。好奇怪啊。没有主键冲突的被保存进去了,有冲突的没有被保存进去。我现在都不打算使用控件的方法了,我自己用SQL进行处理。