procedure TfrmRQZLGL.btnDelete_ZLClick(Sender: TObject);
var
  Str1,Str2:string;
begin
   if Application.MessageBox('正在删除信息,是否继续?', '提示信息', MB_YESNO +
     MB_ICONQUESTION) = IDYES then
   begin
        Str1 := Format('delete from RQ_ZLZB where BillNo = %s',[qry_ZLZB.FieldByName('BillNo').AsString]);
        Str2 := Format('delete from RQ_ZLMXB where BillNo = %s',[qry_ZLZB.FieldByName('BillNo').AsString]);
        if not DMMain.conMain.InTransaction then  DMMain.conMain.BeginTrans;
        try
          DMMain.ExecSQLA(Str1);
          DMMain.ExecSQLA(Str2);
        except
           if DMMain.conMain.InTransaction then  DMMain.conMain.RollbackTrans;
        end;
        DMMain.conMain.CommitTrans;
   end;
end;有以上代码,用来删除主表和从表的关联数据,但是 报错了,说 ‘没有活动事务’,望高人指点!

解决方案 »

  1.   

    应该是出错后RollbackTrans后再执行CommitTrans报错吧
      

  2.   

    需要 BeginTrans

    才能 CommitTrans一般这样DMMain.conMain.BeginTrans
    try
      DMMain.ExecSQLA(Str1);
      DMMain.ExecSQLA(Str2); 
      DMMain.conMain.CommitTrans;
    except
      DMMain.conMain.RollbackTrans;
    end; 
      
      

  3.   


            try
              DMMain.ExecSQLA(Str1);
              DMMain.ExecSQLA(Str2);
            Except 
               if DMMain.conMain.InTransaction then  DMMain.conMain.RollbackTrans;
            end;
            DMMain.conMain.CommitTrans;
    我是在 Except 里面写的 RollBackTrans 最后CommitTrans的
      

  4.   

    也就是说一旦ExecSQLA出错,程序跳到except处执行RollbackTrans,此时事务结束被关闭,再执行CommitTrans就会报错标准的写法见2楼,呵呵