代码如下:function InsertRec(ACode, AName: String): Boolean;
var
  DynADOQuery: TADOQuery;
begin
  Result := False;  DynADOQuery := TADOQuery.Create(Application);
  try
    DynADOQuery.Connection := MyADOConnection;
    DynADOQuery.CacheSize := 500;
    if DynADOQuery.CommandTimeout <> 60 then DynADOQuery.CommandTimeout := 60;
    if DynADOQuery.CursorLocation <> clUseClient then DynADOQuery.CursorLocation := clUseClient;
    DynADOQuery.CursorType := ctStatic;
    MyADOConnection.BeginTrans;
    try
      DynADOQuery.SQL.Clear;
      DynADOQuery.SQL.Add(' insert into Table1 (Code, Name) Values (');
      DynADOQuery.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
      DynADOQuery.SQL.Add(' ''' + Trim(AName) + ''')');
      DynADOQuery.ExecSQL;      DynADOQuery.SQL.Add(' insert into Table2 (Code, CurMonth) Values (');
      DynADOQuery.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
      DynADOQuery.SQL.Add(' 0)');
      DynADOQuery.ExecSQL;      MyADOConnection.CommitTrans;
      Result := True;
    except
      on E: Exception do
      begin
        CustomMessageBox('添加纪录出错!' + #13#10 + '错误信息:' + E.Message, mtSysError);
        MyADOConnection.RollbackTrans;
      end;
    end;
  finally
    DynADOQuery.Free;
  end;
end;
执行后没有出错,但是发现Insert Table1的纪录没有进入数据库中。而Insert Table2的纪录却进去了。
我于是用MSSQL 的 Query Analyzer 执行Insert Table1的SQL语句却没问题。不知有人碰见过吗?难道ADOConnection的事务处理仅对最后一个执行的SQL语句起作用?想不明白,请高手指点!

解决方案 »

  1.   

    DynADOQuery.SQL.Clear;   //加一句      
    DynADOQuery.SQL.Add(' insert into Table2 (Code, CurMonth) Values (');
    DynADOQuery.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
    DynADOQuery.SQL.Add(' 0)');
    DynADOQuery.ExecSQL;
      

  2.   

    Sorry!
    我实际程序代码中,有zfmich加的这句(DynADOQuery.SQL.Clear;),才出现我说的这个问题。后来我去掉了这句(DynADOQuery.SQL.Clear;),反而没问题了。但按程序逻辑,去掉了应该反而有问题才对,因为等于Table1插入了两次一样的纪录。但偏偏这样就对了。好像真的就象我上面说的:ADOConnection的事务处理仅对最后一个执行的SQL语句起作用。谢谢zfmich认真看我的代码,还请指点!
      

  3.   

    同样关注,我也碰到同样问题,只好改用bde.
      

  4.   

    function InsertRec(ACode, AName: String): Boolean;
    var
      DynADOQuery: TADOQuery;
      i :integer;
    begin
      Result := False;  DynADOQuery := TADOQuery.Create(Application);
      try
        DynADOQuery.Connection := MyADOConnection;
        DynADOQuery.CacheSize := 500;
        if DynADOQuery.CommandTimeout <> 60 then DynADOQuery.CommandTimeout := 60;
        if DynADOQuery.CursorLocation <> clUseClient then DynADOQuery.CursorLocation := clUseClient;
        DynADOQuery.CursorType := ctStatic;
        MyADOConnection.BeginTrans ;
        try
          with DynADOQuery do
          begin
            Close ;
            SQL.Clear ;
            SQL.add('insert into table1 (Code, Name) values(:c1,:c2)');
            Parameters.ParamByName('c1').value:= ACode;
            Parameters.ParamByName('c2').value:= AName;
            ExecSQL ;
          end ;      with DynADOQuery do
          begin
            Close ;
            SQL.Clear ;
            SQL.add('insert into table1 (Code, CurMonth) values(:c1,:c2)');
            Parameters.ParamByName('c1').value:= ACode;
            Parameters.ParamByName('c2').value:= AName;
            ExecSQL ;
          end ;      MyADOConnection.CommitTrans;
          Result := True;
        except
          on E: Exception do
          begin
            Application.MessageBox(pChar('添加纪录出错!' + #13#10 + '错误信息:' + E.Message), '', 0);
            if MyADOConnection.InTransaction then MyADOConnection.RollbackTrans;
          end;
        end;
      finally
        DynADOQuery.Free;
      end;
    end;问题可以解决,但是不知道是什么原因,还望高手出招。
      

  5.   

    不好意思,第二个语句是TABLE2
      

  6.   

    zfmich,我按你的方法试了一下,可是问题没有解决。
    但我在同事的机器上试验时,代码不变却没有发生问题。他用的是:SQLServer2000。 后来我又用两个Query分别添加语句,连续执行,则也没有此问题(见下面代码)。看来还是有办法避开此问题的。只好不做深究了。谢谢你!
    function InsertRec(ACode, AName: String): Boolean;
    var
      DynADOQuery1, DynADOQuery2: TADOQuery;
      i :integer;
    begin
      Result := False;  DynADOQuery1 := TADOQuery.Create(Application);
      DynADOQuery2 := TADOQuery.Create(Application);
      try
        DynADOQuery1.Connection := MyADOConnection;
        DynADOQuery1.CursorType := ctStatic;
        DynADOQuery2.Connection := MyADOConnection;
        DynADOQuery2.CursorType := ctStatic;    MyADOConnection.BeginTrans ;
        try
           DynADOQuery1.SQL.Clear;
          DynADOQuery1.SQL.Add(' insert into Table1 (Code, Name) Values (');
          DynADOQuery1.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
          DynADOQuery1.SQL.Add(' ''' + Trim(AName) + ''')');      DynADOQuery2.Clear;
          DynADOQuery2.SQL.Add(' insert into Table2 (Code, CurMonth) Values (');
          DynADOQuery2.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
          DynADOQuery2.SQL.Add(' 0)');       //必须连续执行
          DynADOQuery1.ExecSQL;
          DynADOQuery2.ExecSQL;      MyADOConnection.CommitTrans;
          Result := True;
        except
          on E: Exception do
          begin
            Application.MessageBox(pChar('添加纪录出错!' + #13#10 + '错误信息:' + E.Message), '', 0);
            if MyADOConnection.InTransaction then MyADOConnection.RollbackTrans;
          end;
        end;
      finally
        DynADOQuery.Free;
      end;
    end;问题可以解决,但是同样不知道是什么原因,还望高手出招。
      

  7.   

    执行完table1后,adoquery应该 close 后在执行