AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

JSONArray freigeben?

Ein Thema von Ykcim · begonnen am 18. Dez 2020 · letzter Beitrag vom 24. Dez 2020
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#1

JSONArray freigeben?

  Alt 18. Dez 2020, 11:56
Datenbank: Maria • Version: 10 • Zugriff über: FireDac
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:
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;
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.

Muss ich das TJSONArray nicht freigeben oder muss ich das Result anders bestücken?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: JSONArray freigeben?

  Alt 18. Dez 2020, 12:41
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.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: JSONArray freigeben?

  Alt 19. Dez 2020, 23:04
Zitat:
Wenn du "JsAr" freigibst dann ist es weg. Result ist keine Kopie, es ist eine Referenz, sie zeigt nur auf JsAr.
Okay, das erklärt, warum das Result leer ist, wenn ich JSAr freigebe. Kann ich in das Result auch irgendwie eine Kopie erstellen, damit ich JSAr freigeben konn, ohne dass das Result leer wird. Wenn ich einmal durch die Funktion durch bin, komme ich ja im Nachgang an JSAr nicht mehr dran, um es freizugeben...

Möchte mir auf einer Server-App keine Speicherlecks erzeugen.

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: JSONArray freigeben?

  Alt 19. Dez 2020, 23:19
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.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: JSONArray freigeben?

  Alt 23. Dez 2020, 23:15
Vielen Dank... das Brett war doch ein bißchen fest...

Ich hatte es so schon zuvor versucht, bekam aber immer eine Fehlermeldung:
Zitat:
Exception der Klasse EXDATAHttpEntityNotFound mit der Meldung 'Requested Entity does not exist' aufgetreten
Interessanter Weise wurde aber trotzdem alles korrekt durchgeführt.

Ich habe es jetzt so realisiert, dann kommt die Fehlermeldung nicht:
Delphi-Quellcode:
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;
Macht diese Zeile denn bei einem Result Sinn? Result:= TJSONArray.Create;
Vielen Dank und schöne Weihnachten!
Patrick
Patrick
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#6

AW: JSONArray freigeben?

  Alt 24. Dez 2020, 16:12
Vielen Dank... das Brett war doch ein bißchen fest...

Ich hatte es so schon zuvor versucht, bekam aber immer eine Fehlermeldung:
Zitat:
Exception der Klasse EXDATAHttpEntityNotFound mit der Meldung 'Requested Entity does not exist' aufgetreten
Interessanter Weise wurde aber trotzdem alles korrekt durchgeführt.

Ich habe es jetzt so realisiert, dann kommt die Fehlermeldung nicht:
Delphi-Quellcode:
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;
Macht diese Zeile denn bei einem Result Sinn? Result:= TJSONArray.Create;
Vielen Dank und schöne Weihnachten!
Patrick
Natürlich ist das Result:= TJSONArray.Create; sinnvoll, Du willst ja ein Objekt zurückgeben, das muss nun mal erstellt werden.

Könntest das ja auch so machen:
Delphi-Quellcode:
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;
Nur: Was soll's? Ist nur eine Variabel mehr, die man dann benötigt. Erforderlich ist sie nicht.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz