我需要一个能返回数据集的函数,如下://执行 SQL 语句返回数据集
function TForm_Main.OpenSQL(SQL:string):TDataSet;
begin
var
  ADOQuery:TADOQuery;
  ReturnDataSet:TDataSet;
begin
  //下面联数据库
  Result:=-1;
  with DM do
  begin
    ADOQuery:=TADOQuery.Create(nil);
    ADOConnection.Connected:=true;
    ADOQuery.ConnectionString:=ADOConnection.ConnectionString;
    ADOQuery.SQL.clear;
    ADOQuery.SQL.Add(SQL);
    ADOQuery.Open; //如果返回  表明没有更新数据,此时返回假
    ReturnDataSet:=TDataSet.Create(nil);
    ReturnDataSet.Copy(ADOQuery);
    ADOQuery.Close
    ADOConnection.Connected:=false;
    ADOQuery.Free;
    //在这个地方我要 free ReturnDataSet 么?
  end;
end; 请问,这个局部的 ReturnDataSet 用释放么?怎么释放?

解决方案 »

  1.   

    1)TDataSet是抽象类,你永远不可能实例化的。
    2)在注释的地方不用释放,否则外部无法使用这个返回值。
    如果这样:
    ResultDataSet := TTable.Create(Application);
    那么ResultDataSet地释放由Application完成,你不用操心。
    另外需要Result := ResultDataSet;
      

  2.   


     谢谢chechy(简简单单的活)
     1. 你的意思是不能返回 TDataSet 对么?
     2. 请问 ADOQuery:=TADOQuery.Create(nil); 写,后面不用 self 对么?
        这样以来是由谁来势放的?
     
     
     
      

  3.   

    1)可以返回TDataSet,但是你无法执行这个代码:
     ReturnDataSet:=TDataSet.Create(nil);
    2)如果Create中参数是nil,这是允许的,但是释放要有你自己完成,否则就有内存泄漏。