我在应用程序中使用TFDDataSet组件时遇到问题。
如果客户有新订单,我有一个可以多次获取的功能。如果它返回空,则函数结束。
...
fdm_XMLREsumo.Close;
fdm_XMLREsumo.Active := false;
_DataSetJSON := SM.GetXMLResumoChave( pEnt_ID, pChave); //See Edit 1
_DataSet.Close;
_DataSet := TFDJSONDataSetsReader.GetListValueByName( _DataSetJSON, sXMLResumo );
_DataSet.Open; <-- here's the problem
if not _DataSet.IsEmpty then begin
exit;
end;
fdm_XMLREsumo.AppendData( _DataSet );
...
问题是,每次执行_DataSet.Open;
时,它都会在我的数据库中创建一个新连接。
因此我有too many connections
例外。
<我已经检查了我的服务器属性,它是这样的:
我尝试了Connection.Close
,_DataSet.Close
,_DataSet.Free
和_DataSet.Destroy
,但没有任何效果。
我读过this,它解释说甚至如果您_DataSet.Close
,则连接仍然存在,因为DataSets
在内存中工作。
还有this人有类似问题,但使用Query
。<有谁知道我怎么设法解决这个问题?
我正在使用 MySQL
编辑1
@CraigYoung帮助我说我的例子需要MCVE
SM.GetXMLResumoChave
方法:
这里它使用与函数末尾关闭的数据库的连接。已经调试过,这里它没有在MySQL处理列表中留下开放连接
function TDAOXMLResumo.GetXMLResumoChave(xEnt_id: Integer; xChave: String): TFDJSONDataSets;
begin
if not oSM.FDConn.Connected then
oSM.FDConn.Connected := true;
QueryPesquisa.SQL.Clear;
QueryPesquisa.SQL.Text :=
' select * from table' +
' where ent_id = :ent_id ' +
' and xre_chNFe = :xre_chNFe ';
QueryPesquisa.ParamByName('ent_id').Asinteger := xEnt_id;
QueryPesquisa.ParamByName('xre_chNFe').Asstring := xChave;
Result := TFDJSONDataSets.Create;
//TFDJSONDataSetsWriter.ListAdd Opens the Query that is passed as parameter and store the data as JSON in the TFDJSONDataSets (Result) object
TFDJSONDataSetsWriter.ListAdd(Result, sXMLResumo, QueryPesquisa);
//Closing the Query
QueryPesquisa.Close;
//Closing the Connection
oSM.FDConn.Close;
end;`
基本上,_DataSet
仅在此处接收JSON列表:_DataSet := TFDJSONDataSetsReader.GetListValueByName( _DataSetJSON, sXMLResumo );
,然后打开它以访问其中的数据。