事务中执行了三个SQL语句,其中的一个执行语句失败,事务为什么没有回滚。语句如下.  
其中insert  into  tblPeelScroll(ScrollBar,PeelDate,PeelMan)      
values('123','0002','2005-12-07  11:21:27');  这一句是错误的。他为什么没有回滚。是不是我自己要做判断。谢谢!!  
 
cn.Open  gConnstr        
cn.BeginTrans  
 
cn.Execute  "IF  exists(select  ScrollBar  from  TblStorage  where  ScrollBar='0050905110050451562125203129')    
begin      
update  TblStorage  set  Status=2  ,UpdateID='0001',UpdateTime='2005-12-07  11:21:27'  where  ScrollBar='0050905110050451562125203129';    
insert  into  tblPeelScroll(ScrollBar,PeelDate,PeelMan)      
values('123','0002','2005-12-07  11:21:27');    
insert  into  tblScrollLog(ScrollBar,CodeID,ShelfID,WareHouseID,SAction,UserID,ActDate,UpdateID)  
select  ScrollBar,CodeID,ShelfID,WareHouseID,'2','0002',getdate(),'0001'  from  TblStorage    where  ScrollBar='123'      
end  "  
 
cn.CommitTrans

解决方案 »

  1.   

    cn.BeginTrans  
     
    On Error Goto upDateErr '<-----------设置错误陷阱
    cn.Execute  "IF  exists(select  ScrollBar  from  TblStorage  where  ScrollBar='0050905110050451562125203129')    
    begin      
    update  TblStorage  set  Status=2  ,UpdateID='0001',UpdateTime='2005-12-07  11:21:27'  where  ScrollBar='0050905110050451562125203129';    
    insert  into  tblPeelScroll(ScrollBar,PeelDate,PeelMan)      
    values('123','0002','2005-12-07  11:21:27');    
    insert  into  tblScrollLog(ScrollBar,CodeID,ShelfID,WareHouseID,SAction,UserID,ActDate,UpdateID)  
    select  ScrollBar,CodeID,ShelfID,WareHouseID,'2','0002',getdate(),'0001'  from  TblStorage    where  ScrollBar='123'      
    end  "  
     
    cn.CommitTransExit Sub
    upDateErr:
    cn.RollbackTrans '<------------如果有错误则回滚事务
      

  2.   

    谢谢!faysky2() ( ) 
    你的回答。
    我在实际的代码中也加入的有On Error Goto upDateErr '<-----------设置错误陷阱
    不过,我是在cn.BeginTrans前,我刚试过把错误陷阱放在cn.BeginTrans  后也是一样的可以执行成功,而没有回滚事务.
    我这个一个Execute语句中,其实包含 一个判断,和三个Sql语句。其中第二个语句
    insert  into  tblPeelScroll(ScrollBar,PeelDate,PeelMan)      
    values('123','0002','2005-12-07  11:21:27');   
    中的PeelDate和PeelMan的value我写反了。如果在查询分析器中执行。第一个和三个语句是可以执行的。但是第二个语句出现String or binary data would be truncated.
    The statement has been terminated.的提示。
    我现在用cn.BeginTrans  ,不知是什么原因。事条没有回滚。谢谢指导!!
      

  3.   

    ......
    Exit Sub
    upDateErr:
    cn.RollbackTrans '<------------如果有错误则回滚事务
    MsgBox Err.Description '<----------------加这句测试看有没有产生错误
      

  4.   

    试试 cn.CursorLocation = adUseServer 也可以将语句拆开,分多次 cn.execute ...
    因为执行的是系列语句,ado 可能处理不好。
      

  5.   

    搞混了ado的事物处理,跟sql的事物处理象你这样执行系列语句的,可以两种方法
    1、要用ado的事物处理的话,就分开执行,每次执行单个语句,上面已经讲到很多了
    2、用sql server的事物处理,在SQL语句中用事务就可以,ado就不用加事物处理了:begin tran --开始事物
    update ....--(单条语句)
    if @@error <> 0 --捕获错误
    rollback tran --回滚
    ....反复执行,每条语句如上错误处理
    commit tran --没有错误,则提交事物
      

  6.   

    ADO事务回滚一般都是没回滚的,在错误的操作都没撤消的
      

  7.   

    ADO的回滚功能绝对没问题,你的问题在于字段内容被截断对ADO来讲不是错误,所以不会跳到陷阱里面去。
      

  8.   

    谢谢大家的热心帮助。
    我在查询分析器中执行下面的语句是
    老是出现:
    服务器: 消息 3902,级别 16,状态 1,行 20
    COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
    其中  insert  into  tblPeelScroll(ScrollBar,PeelDate,PeelMan)  
    values('123','0002','2005-12-07  11:21:27'); 是一个错误的语句。begin tran  myTran
    IF  exists(select  ScrollBar  from  TblStorage  where  ScrollBar='000501040000000040450781100310')  
    begin   
     update  TblStorage  set  Status=2  ,UpdateID='0001',UpdateTime='2005-12-07  11:21:27' 
     where  ScrollBar='0050905110050451562125203129';
                    if @@error <> 0 rollback tran
     insert  into  tblPeelScroll(ScrollBar,PeelDate,PeelMan)  
    values('123','0002','2005-12-07  11:21:27'); 
    if @@error <> 0 rollback tran           insert  into  tblScrollLog(ScrollBar,CodeID,ShelfID,WareHouseID,SAction,UserID,ActDate,UpdateID)
      select  ScrollBar,CodeID,ShelfID,WareHouseID,'2','0002',getdate(),'0001'  from  TblStorage   
    where  ScrollBar='123'         if @@error <> 0 rollback tran
            


    end
    commit tran