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;
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;
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释放后,服务端自动释放。。
function TServerMethods.GetData(SQLStr: String): TFDJSONDataSets;
中的Q: TFDQuery;
不能任意释放,因为还在传递数据呢,释放了,传递什么?这里DataSanp默认自动释放。
Q.Free; ?????加上这句提取数据时报错,不加内存泄露
在关闭客户端后,再退出服务器端就报内存泄露