ADOQUERY的SQL属性中同时存在多条插入语句
Insert AAA(ID,Name) Values('111','111')
Insert AAA(ID,Name) Values('111','111')
Insert AAA(ID,Name) Values('111','111')
AAA表存在主键约束,执行代码如下,本以为会因为出现键重复而完全回滚,但是在执行的过程中并不会触发错误,并且第一行插入成功,并没有回滚,如果再次执行才会触发错误,请高手指点,谢谢!!    try   
      ADOCon.Open;
      ADOCon.BeginTrans;
      ADOInsert.ExecSQL;
      ADOCon.CommitTrans();
      RevMemo.Items.Add(TableName+' 执行成功¡');
    except
      RevMemo.Items.Add(TableName+' 执行失败¡');
      ADOCon.RollbackTrans();
    end;

解决方案 »

  1.   

    把这个
        ADOInsert.ExecSQL;
    换成
    ADOCon.Execute(your SQL)
      

  2.   

    建议这样试:try   
          ADOCon.Open;
          ADOCon.BeginTrans;
          //此处放:Insert AAA(ID,Name) Values('111','111')(保证记录中已经有的);
           //此处放:update....;
          ADOCon.CommitTrans();
          RevMemo.Items.Add(TableName+' 执行成功¡');
        except
          RevMemo.Items.Add(TableName+' 执行失败¡');
          ADOCon.RollbackTrans();
        end;
    你看是否执行update就可以确定你的问题是什么原因了。
      

  3.   

    晕!你干吗在一个QUERY定义三个SQL语句!如果这样也可以的话下面这样的语句
    RECORDSET的值怎么办??
    SELECT * FROM TABLE1
    SELECT * FROM TABLE2
    SELECT * FROM TABLE2
      

  4.   

    可能你的采用的数据库不支持多SQL语句,后面的被或略了
      

  5.   

    刚才我小试了一下,得出结论是(个人看法):
    Insert AAA(ID,Name) Values('111','111')
    Insert AAA(ID,Name) Values('111','111')
    Insert AAA(ID,Name) Values('111','111')
    虽然放在一个sql中,但执行是跟放在3个sql中执行是一样的。
      

  6.   

    如果改为本地修缓存改后再提交就不会出现这种情况了。insert也是直接操作操作数据库。
      

  7.   

    请注意这样一个区别:ADOQUERY/QUERY 的SQL语句若为多个SQL子句组成,那么,执行后只能捕捉第一个SQL的异常错误,并且不能回滚。如果第一条语句正确,其他语句不正确(包括你的做法),不会有异常提示。而ADOStoredProc/StoredProc就很好的解决了此问题如果必须用ADOQUERY/QUERY 执行多条语句的话,建议在语句内部使用事务机制(与数据库有关),如:SqsStr:='begin tran insert into ..values() '+
            'if @@error<>0 then begin rollback tran return end '+
            '....'+
            'commit tran';
    但是这样你就判断不出是否执行成功!只是保全了数据的完整性!
      

  8.   

    补充一句:本人讨厌、憎恨、极其不愿意用Delphi的事务,在多用户操作的系统中,会出现莫名其妙的死锁!
      

  9.   

    我的观点和renzhm(戴尔飞)的一致,ADOQUERY/QUERY 的SQL语句确实只捕捉第一条sql语句的错误.所以我也建议再给ADOQUERY设置sql语句的时候,直接在其内部使用事务