![]() |
Datenbank: Maria • Version: 10 • Zugriff über: FireDac
JSONArray freigeben?
Hallo Zusammen,
ich entwickle gerade eine Client-Server App. Dabei werden von dem Server die DB-Aktionen durchgeführt und die Ergebnisse mittels JSON-Objecte an den Client geschickt. Die letzte Function gibt ein JSONArray als Result zurück:
Delphi-Quellcode:
Ich versuche immer alle Objecte, die ich create auch wieder mit Free freizugeben. In diesem Fall übergebe ich zuvor dem Result (vom Typ TJSONArray) die Variable TJSONArray, mit der ich vorher gearbeitet habe. Wenn ich nun die Variable freigebe, dann verliert das Result seinen Werte und ist wieder leer. Wenn ich das JSAr.Free rausnehme funktioniert es.
function TTV_CreateNewCustService.Get_Customer(company_id: integer): TJSONArray;
var Logic: TLogic; JSAr: TJSONArray; Query: TFDQuery; JSW: TFDBatchMoveJSONWriter; BDSR: TFDBatchMoveDataSetReader; BMove: TFDBatchMove; I: Integer; begin Logic:= TLogic.create; JSAr:= TJSONArray.Create; Set_DBComps(Query, JSW, BDSR, BMove); Try Query.SQL.Add('select * from company '+ 'where company_id= :c_id'); Query.ParamByName('c_id').AsInteger:=company_id; Get_DataBatch(BMove, JSAr); Result:=JSAr; Finally Query.Free; JSW.Free; BDSR.Free; BMove.Free; //JSAr.Free; Wenn ich das nicht auskommentiere, verliert Result seinen Wert... Logic.Free; End; end; Muss ich das TJSONArray nicht freigeben oder muss ich das Result anders bestücken? Vielen Dank Patrick |
AW: JSONArray freigeben?
Du musst gar nichts, du entscheidest ja, was deine Methode macht.
Wenn du etwas Neues erstellst und das zurücklieferst ist es die Verantwortung von dem Code der es aufruft, das Objekt wieder freizugeben. In dem Fall solltest du die Methode dann aber auch vielleicht nicht "get..." sondern "create..." nennen um das deutlicher zu machen. Eine andere Möglichkeit ist als Parameter direkt ein TJsonArray zu haben in welches du deine Werte reinschreibst. Auch in dem Fall ist es nicht mehr deine Verantwortung, das Objekt freizugeben. Wenn du "JsAr" freigibst dann ist es weg. Result ist keine Kopie, es ist eine Referenz, sie zeigt nur auf JsAr. |
AW: JSONArray freigeben?
Zitat:
Möchte mir auf einer Server-App keine Speicherlecks erzeugen. Vielen Dank Patrick |
AW: JSONArray freigeben?
Wenn ich das Brett vorm Kopf wegnehmen dürfte:
Einfach JSAr aus dem Variablenbereich löschen und stattdessen nur Result verwenden. Das Ergebnis der Funktion dann entsprechend nach Aufruf freigeben. |
AW: JSONArray freigeben?
Vielen Dank... das Brett war doch ein bißchen fest...:lol:
Ich hatte es so schon zuvor versucht, bekam aber immer eine Fehlermeldung: Zitat:
Ich habe es jetzt so realisiert, dann kommt die Fehlermeldung nicht:
Delphi-Quellcode:
Macht diese Zeile denn bei einem Result Sinn?
function TTV_CreateNewCustService.Get_CustProp(company_id: integer): TJSONArray;
var Logic: TLogic; Query: TFDQuery; JSW: TFDBatchMoveJSONWriter; BDSR: TFDBatchMoveDataSetReader; BMove: TFDBatchMove; I: Integer; begin Logic:= TLogic.create; Result:= TJSONArray.Create; //Das hier macht den Unterschied, ob die Fehlermeldung kommt oder nicht. Set_DBComps(Query, JSW, BDSR, BMove); Try Query.SQL.Add('select e.* from hlp_einstellungen e '+ 'where company_id= :c_id'); Query.ParamByName('c_id').AsInteger:=company_id; Get_DataBatch(BMove, Result); Finally Query.Free; JSW.Free; BDSR.Free; BMove.Free; Logic.Free; End; end;
Delphi-Quellcode:
Result:= TJSONArray.Create;
Vielen Dank und schöne Weihnachten! Patrick |
AW: JSONArray freigeben?
Zitat:
Delphi-Quellcode:
sinnvoll, Du willst ja ein Objekt zurückgeben, das muss nun mal erstellt werden.
Result:= TJSONArray.Create;
Könntest das ja auch so machen:
Delphi-Quellcode:
Nur: Was soll's? Ist nur eine Variabel mehr, die man dann benötigt. Erforderlich ist sie nicht.
function TTV_CreateNewCustService.Get_CustProp(company_id: integer): TJSONArray;
var // Logic: TLogic; -- Wird nicht benutzt, kann von daher entfallen. Query: TFDQuery; JSW: TFDBatchMoveJSONWriter; BDSR: TFDBatchMoveDataSetReader; BMove: TFDBatchMove; JA : TJSONArray; // I: Integer; -- Wird nicht benutzt, kann von daher entfallen. begin // Logic:= TLogic.create; JA := TJSONArray.Create; Set_DBComps(Query, JSW, BDSR, BMove); Try Query.SQL.Add('select e.* from hlp_einstellungen e '+ 'where company_id = :c_id'); Query.ParamByName('c_id').AsInteger := company_id; Get_DataBatch(BMove, JA); Finally Query.Free; JSW.Free; BDSR.Free; BMove.Free; // Logic.Free; End; Result := JA; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz