function TServerMethods.GetData(SQLStr: String):    TFDJSONDataSets;
var
  Q: TFDQuery;
begin
  Q := TFDQuery.Create(nil);
  Q.Connection := DataM.FDCon;
  try
    Q.Open(SQLStr);
   Result := TFDJSONDataSets.Create;
    // Add departments dataset
    TFDJSONDataSetsWriter.ListAdd(Result,Q);
  finally
    Q.Free;   ?????加上这句提取数据时报错,不加内存泄露
  end;
end;
环境:  XE6
我看了 Data.FireDACJSONReflect 单元
destructor TFDJSONDataSetsBase.Destroy;
begin
  if FOwnsDataSets and (FDataSets <> nil) then
    while FDataSets.Count > 0 do
    begin
{$IFNDEF NEXTGEN}
      FDataSets[0].Value.Free;  ?????这块好像并没释放DATASET
{$ENDIF}
      FDataSets.Delete(0);
    end;
  FDataSets.Free;
  inherited;
end;

解决方案 »

  1.   

    我碰到类似的问题,服务端对象的释放function TdssmServerMethods.GetDataR(const ASQLStr: string): TDBXReader;
    var
      aDBXCommand:TDBXCommand;
    begin
      Result:=nil;
      if not sqlconMethods.Connected then
        sqlconMethods.Open;
      aDBXCommand:=sqlconMethods.DBXConnection.CreateCommand;  try
        aDBXCommand.Text:=ASQLStr;
        aDBXCommand.CommandType:=TDBXCommandTypes.DbxSQL;  //'Dbx.SQL'
        Result:=aDBXCommand.ExecuteQuery;
      except
        sqlconMethods.Close;    //这里是返回一个TDBXReader实例给客户端,估计TDBXReader是长连接,所以不能关闭连接
      end;
    end;这里的 aDBXCommand不能释放,
    也不能这样
    finally
       sqlconMethods.Close; 据说是客户端调用这个方法, 客户端的实例TDBXReader释放后,服务端自动释放。。
      

  2.   

    你定义的方法: 
    function TServerMethods.GetData(SQLStr: String):    TFDJSONDataSets;
    中的Q: TFDQuery;
    不能任意释放,因为还在传递数据呢,释放了,传递什么?这里DataSanp默认自动释放。 
      

  3.   

      finally
         Q.Free;   ?????加上这句提取数据时报错,不加内存泄露
    在关闭客户端后,再退出服务器端就报内存泄露