在Delphi的ADO数据库应用程序中出现错误:
ITransaction::Commit 或Itransaction::Abort被调用,并且对象处于zombie状态
这是怎么回事?应该怎么解决呀?
环境D7+ADO2.8+SQL2000

解决方案 »

  1.   

    例如:A 表中有10条记录,我要将这10条记录,插入B表中。
     我代码是这样写的
     dim rs
      set rs=server.createobjct("adodb.recrodset")
      sql="select * from a"
      rs.open sql,conn,1,1
      do while not rs.eof
       sql="insert into b (dd,aa) values ('" & trim(rs("dd")) & "','" & trim(rs("aa")) & "')"
     conn.begintrans     
     conn.execute(sql)  
      if conn.errors.count>0 then
          conn.rollbacktrans
          response.write "对不起,你提交出错了!"  
      else
         conn.committrans
      end if
      rs.movenext
     loop
      rs.close
      set rs=nothing
    这样子会出现以下错误 
    Microsoft OLE DB Provider for SQL Server 错误 '8000ffff' ITransaction::Commit 或 ITransaction::Abort 被调用,并且对象处于 zombie 状态。 /shop/txdhd.asp,行15 (rs.movenext这名出现) //请问有办法解决吗?
    =========================================================================
    //这样字就好了
    dim rs
      set rs=server.createobjct("adodb.recrodset")
      sql="select * from a"
      rs.open sql,conn,1,1
     conn.begintrans  //put here
      do while not rs.eof
       sql="insert into b (dd,aa) values ('" & trim(rs("dd")) & "','" & trim(rs("aa")) & "')"
       
     conn.execute(sql)  
      if conn.errors.count>0 then
          conn.rollbacktrans
          response.write "对不起,你提交出错了!"  
         response.end
       end if
      rs.movenext
     loop
    conn.committrans //最后提交事务
      rs.close
      set rs=nothing
      

  2.   

    所以:
    最好是调用数据库系统中的事务控制并写上事务标识begin transaction T1回滚时也带上T1标记在sql server中,在insert,update,delete语句后系统会自动增加commit transaction
    (应该是吧,如果没记错.......)
      

  3.   

    我是这样使用才出错的.
    ADOConnection1.BeginTrans
    try
      ADOConnection.exec('.....');
    except
      ADOConnection1.RollbackTrans;
    end;
    ADOConnection1.CommitTrans;
      

  4.   

    应该是你的SQL语句有错误,所以事务回滚了,也就是执行了ADOConnection1.RollbackTrans;这一句,然而在异常处理后你又添加了一句ADOConnection1.CommitTrans;,此时你的事务已经回滚,再提交当然就出错了。
    改为:
    ADOConnection1.BeginTrans;
    try
      ADOConnection.exec('.....');
     ADOConnection1.CommitTrans;
    except
      ADOConnection1.RollbackTrans;
    end;
    另外,先检查你的SQL语句吧。
      

  5.   

    改成:
    try
      ADOConnection1.BeginTrans;
      ADOConnection.exec('.....');
     ADOConnection1.CommitTrans;
    except
      ADOConnection1.RollbackTrans;
    end;也报同样的错误. SQL语句是正确的.跟踪调试,它是执行了CommitTrans语句的.
    ITransaction::Commit 或Itransaction::Abort被调用,并且对象处于zombie状态
      

  6.   

    try
      ADOConnection1.BeginTrans;
      ADODataSet1.UpdateBatch(arAll)
     ADOConnection1.CommitTrans;
    except
      ADOConnection1.RollbackTrans;
    end;
    也报错:ITransaction::Commit 或Itransaction::Abort被调用,并且对象处于zombie状态
      

  7.   

    有没有办法判断出ADOConnection是否处在zombie状态?