代码如下:Flist里面装有SQL语。就这段代码。一个月前是正确的,今天忽然发现事务没有起作用!我用的dbconn.begintrans以前在SQL SERVER的事件探测器里面有显示,现在竟然没有了
不知道了是怎么一回事
procedure TfrmImport.ExecSQL;
var
  i:integer;
begin
 if not dbconn.InTransaction then
       dbconn.BeginTrans;    for i:=0 to FList.Items.Count-1 do
    begin
      with ADOQuery do
      begin
      try
        close;
        SQL.Clear;
        SQL.Add(Flist.Items[i]);
        ExecSQL;
      except
        on E:Exception do
        Begin
           dbconn.RollbackTrans;
          showmessage('导入第'+inttostr(i+2 )+'行数据时出错,错误信息是:'+E.Message);          break;
        end;
      end;
      end;
    end;
    //如果数据都没有错误
    if  dbconn.InTransaction then
    begin
         dbconn.CommitTrans;
         showmessage('成功导入数据');
    end;
end;

解决方案 »

  1.   

    程序如果中间出现异常,你就ROLLBACKTRANS了,由于BEGINTRANS没有包含在循环里,所以后面事务没有开始,自然就不其作用了,如果程序一直正常,你的结果就是对的,如果在中间出错,肯定就错了
      

  2.   

    找一条错误的语句,触发dbconn.RollbackTrans,看看有没有垃圾数据
    如果没有,就没事
      

  3.   

    昨天就是出错了没有Rollback啊。
    我update 50条记录,最后一条故意设置错误,结果系统'showmessage('导入第'+inttostr(i+2 )+'行数据时出错,错误信息是:'+E.Message);'执行了这个,然后执行rollback,但是最后查看结果的时候前面update的东西并没有回滚!
      

  4.   

    你试试把try  放在if not dbconn.InTransaction then前
      

  5.   

    不好意思搞错了,应该放在for i:=0 to FList.Items.Count-1 do前
      

  6.   

    以前调用adoconn.begintrans的时候在SQL SERVER的事件探测器里面会有下面的信息。
    set implicit_
    transaction on),
    现在就没有了。不知道是不是那个地方设置有问题
      

  7.   

    写的真是怪异:)这样试试。
    dbconn.BeginTrans;
    try
      做你要对数据库的操作
      dbconn.CommitTrans;
      Showmessage('你的提示语');
    except
      dbconn.RollbackTrans;
      Showmessage('你的提示语');
    end;