现在我有两个表.它们保存时要在一个事务中...
try
  conn.BeginTrans();
  adot1.UpdateBatch();
  adot2.UpdateBatch();
  conn.CommitTrans;
except
  on e:Exception do begin
    conn.RollbackTrans;
  end;
end;
  
在两个表能保存时代码能正常运行.但是如果t2保存时遇到约束错的时候.回滚事务.然后由用户再改动t2.再保存时.就出错了.经发现是因为第二次保存时,t1的UpDateBatch已经失效.最后发现到因为t1每个记录的RecordStatus都设为rsUnmodified.但这个RecordStatus是只读的.我不能把它改为原值.头痛中....

解决方案 »

  1.   

    我用了一个很笨的办法,
    adot1.updatebatch();前面加adot1.edit;不知道能不能解决问题?
      

  2.   

    颠倒一下.如果T2ok,T1不行呢??一样是这样.
      

  3.   

    将ADOTable换成ADOQuery.这样,虽然增加了代码量,但却是程序更健壮,可控性更强,还不会出现楼主的错误.
      

  4.   

    都不对.我已经找到解决的方法了.
    try 
      conn.BeginTrans(); 
      adot1.UpdateBatch(); // 改为adot1.Recordset.UpdateBatch($00000003);
      adot2.UpdateBatch();   conn.CommitTrans; 
      adot1.Refresh();  //新添的一句
    except 
      on e:Exception do begin 
        conn.RollbackTrans; 
        
      end; 
    end; 把代码作如上改动.这样t1批更新后.记录提交到数据库,但标记是不会改变的.等t2也提交成功后,通过refresh来把t1的标记全部更新.如果t2提交发生异常时,就会回滚事务..
    之后用户再按"取消"按钮时,执行
    adot1.CancelBatch();
    adot2.CancelBatch();这样t1和t2也可以正常取消了!!!!!
      

  5.   

    如果这样处理:try  
      conn.BeginTrans();  
      adot1.UpdateBatch(); // 改为adot1.Recordset.UpdateBatch($00000003); 
      adot2.UpdateBatch();    conn.CommitTrans;  
      adot1.Refresh();  //新添的一句 
    except  
      on e:Exception do begin  
        conn.RollbackTrans;  
        adot1.CancelBatch(); 
        adot2.CancelBatch(); 
      end;  
    end;是否就可以不用等待用户响应了?