很简单,就是生成临时的dataset,用完后,还要释放,所以是两个函数。
class procedure SQLHelper.ExecuteNonQuery(conn: TADOConnection;
  strSQL: string);
var
  query : TADOQuery;
begin
  query := TADOQuery.Create(nil);
  query.Connection := conn;
  query.SQL.Clear;
  query.SQL.Add(strSQL);
  query.ExecSQL;
  query.Close;
  query.Free;
  query := nil;
end;class procedure SQLHelper.ReleaseDataSet(ds: TDataSet);
begin
{  if ds.Active then
    ds.Close;
  ds.Free;
  ds := nil;  }
  if ds.Active then  //因为批量复制中未选择复制时出现问题,修改
  begin
    ds.Close;
    ds.Free;
    ds := nil;
  end;
end;使用时:
  var ds: TDataSet;  strSQL := '……';
  try
     ds := SQLHelper.ExecuteDataSet(adoconnMain,strSQL);
     ……
  finally
    SQLHelper.ReleaseDataSet(ds);
  end;但心里对这个释放函数一直觉得不踏实,不知是否真能释放掉,所以请大家帮看看,如果不对,怎么改好,谢谢。

解决方案 »

  1.   

    应该这样好点
    class procedure SQLHelper.ExecuteNonQuery(conn: TADOConnection;
      strSQL: string);
    var
      query : TADOQuery;
    begin
      query := TADOQuery.Create(nil);
      try
         query.Connection := conn;
         query.SQL.Clear;
         query.SQL.Add(strSQL);
         query.ExecSQL;
         query.Close;
       finally
         query.Free;
         query := nil;
       end;
       
    end;class procedure SQLHelper.ReleaseDataSet(ds: TDataSet);
    begin
      if ds.Active then //因为批量复制中未选择复制时出现问题,修改
      begin
        try
           ds.Close;
         finally
           ds.Free;
           ds := nil;
        end;
      end;
    end;
      

  2.   

    一般加个 try..except/finally ..end 
    来处理异常,这样 无论是否发生异常 都会释放掉~
      

  3.   

    ReleaseDataSet函数的声明部分,应该是传地址引用的吧,所以应该在参数加加上VAR。
    class procedure SQLHelper.ReleaseDataSet(var ds: TDataSet);
      

  4.   

    楼主并没有把ExecuteDataSet函数的实现贴出来呀~~
      

  5.   

    使用try..except/finally ..end 容錯結構語句
      

  6.   

    对不起,对不起,贴错了,ExecuteDataSet函数是:
    class function SQLHelper.ExecuteDataSet(conn: TADOConnection;
      strSQL: string): TDataSet;
    var
      query : TADOQuery;
    begin
      query := TADOQuery.Create(nil);
      query.Connection := conn;
      query.SQL.Clear;
      query.SQL.Add(strSQL);
      query.Open;
      result := query;
    end;
      

  7.   

    不过这样也知道自己的ExecuteNonQuery函数的不足了,谢谢大家,看来自己的功力太浅了,真应该让大家帮忙把代码完善一下。
      

  8.   


    对呀,我就是担心是不是真的能释放掉,dataset类型本身就是个值引用吧?
      

  9.   

    值引用?到底是值?还是引用?对象参数只能是引用参吧,不会是值参的,因为对象是指针,只能定义为常量参或可变参。你那个函数就行了,怎么说呢,编译器认为这样就算释放了,但是不是这个对象就在内存中真的消失了,什么时候消失的,是不是调用Free的时候就立刻消失了,这些都是暗箱操作,就不得而知了。说白了只要按照编译器定的规矩走,就可以认为“真的释放了”。
      

  10.   

    原来是这样呀,这么说这个函数应该是生效的。
    谢谢bluekitty。