我使用D2007(UP2)+dbExpress+MSSQL开发MIS系统,是使用事务的时候程序经常会报错:不能创建新事务。
比如主从表的保存,代码如下:
function TTemp_Bill.SaveData:Boolean;
begin
  Result:=False;  if MCDS.Active and DCDS.Active then begin
    Saving:=True;
    try
      with MCDS do begin
        if (State=dsInsert) or (State=dsEdit) then
          Post;
      end;
      with DCDS do begin
        if (State=dsInsert) or (State=dsEdit) then
          Post;
      end;      BeginTran;
      if MCDS.ApplyUpdates(0)+DCDS.ApplyUpdates(0)>0 then begin
        RollbackTran;
        ShowMsg(PChar(UpdateFailStr),'保存失败',MB_ICONERROR);
      end
      else begin
        CommitTran;
//        MCDS.Refresh;
//        DCDS.Refresh;
        Result:=True;
      end;
    finally
      Saving:=False;
    end;
  end;
end;是经常报错,并不是每次都报错。还有其他方面的错误,不过都已经解决了,就这个问题捆饶我很久了,望高手指点迷津。

解决方案 »

  1.   

    我跟踪了很多次,发现BeginTran时出错,有时是在ApplyUpdates时报错。
    以下是事务控制的3个过程:
    var
      Tran:TDBXTransaction;//------------------------------------------------------------------------------procedure BeginTran;
    begin
      if SysCon.InTransaction then
        RollbackTran;
      Tran:=SysCon.BeginTransaction;
    end;//------------------------------------------------------------------------------procedure CommitTran;
    begin
      if Assigned(Tran) then
        SysCon.CommitFreeAndNil(Tran);
    end;//------------------------------------------------------------------------------procedure RollbackTran;
    begin
      if Assigned(Tran) then
        SysCon.RollbackFreeAndNil(Tran);
    end;
      

  2.   

    怎么感觉你不是再用dbExperss的SQLConnectin的事务。
      

  3.   

    哎,BS一下李维大哥,把dbExpress吹捧的那高,结果bug多的受不了。
      

  4.   

    既然是DELPHI 2007+SQL 2005,為何不用ADO組件!偶也是Delphi 7 /2007 +MSSQL 用戶,呵呵
      

  5.   

    StartTransaction与BeginTransaction效果是一样的,BeginTransaction使用更方便些。
    我试过使用StartTransaction也是有那样的现象。
      

  6.   

    李维除了技术还是个商人。
    不知他有没有真正用dbExpress做个项目。
    dbExpress不熟悉,帮不了你。
      

  7.   

    改用CoreLab的驱动后。问题全解决了。
      

  8.   

    谢谢,我也碰到了这样的问题,现在是:是不是需要换ADO算了,毕竟DBEXPRESS的明天看不清楚