Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.431 Beiträge
 
Delphi 7 Professional
 
#3

AW: [FireDAC][DatS]-1.Name[View] ist in der Liste doppelt vorhanden

  Alt 13. Dez 2023, 18:32
Du öffnest im Ablauf mehrere Querys. Im Quelltext kann ich aber keine entsprechende Anzahl von Close finden.
Vor der Freigabe der Querys würd' ich explizit ein Close aufrufen.
Delphi-Quellcode:
procedure TMxSQL.Get_Settings(var Cols: TCols; var Rows: TRows; Tabelle: string; AStream: TStream);
var Logic: TLogic;
      qry_Settings: TFDQuery;
begin
   Logic:= TLogic.Create;
   Logic.Set_Query_FDMngr(qry_Settings, 'BDHMySQL');
   Try
      qry_Settings.sql.Add('select * from ' + Tabelle);
      ExecQuery(qry_Settings, Cols, Rows); //Hier wird die Query geöffnet und das Ergebnis in Arrays of string gespeichert
      if Assigned(AStream) then begin
         qry_Settings.SaveToStream(AStream, sfJSON);
      end;
      qry_Settings.Close; // Wird nicht mehr benötigt, daher zumachen.
   Finally
      qry_Settings.Free; // Freigabe der Query, oder erfolgt die Freigabe
                         // automatisch in Logic.Free?
      Logic.Free;
   End;
end;
Wenn AStream zwingend erforderlich ist, kann man sich bei if not Assigned(AStream) die Routine sparen, daher würd' ich die Prüfung an den Anfang verschieben.
Delphi-Quellcode:
procedure TMxSQL.Get_Settings(var Cols: TCols; var Rows: TRows; Tabelle: string; AStream: TStream);
var Logic: TLogic;
      qry_Settings: TFDQuery;
begin
   if not Assigned(AStream) then exit; // und passende Fehlermeldung ins Protokoll, sonst sucht man sich ggfls. 'nen Wolf nach 'nem vollkommen anderen Fehler im SQL, der zwar nicht existiert, aber durch den fehlenden Stream "übertünscht" wird.

   Logic:= TLogic.Create;
   Logic.Set_Query_FDMngr(qry_Settings, 'BDHMySQL');
   Try
      qry_Settings.sql.Add('select * from ' + Tabelle);
      ExecQuery(qry_Settings, Cols, Rows); // Hier wird die Query geöffnet und das Ergebnis in Arrays of string gespeichert
      qry_Settings.SaveToStream(AStream, sfJSON);
      qry_Settings.Close; // Wird nicht mehr benötigt, daher zumachen.
   Finally
      qry_Settings.Free; // Freigabe der Query, oder erfolgt die Freigabe
                         // automatisch in Logic.Free?
      Logic.Free;
   End;
end;
Und ehrlich gesagt hab' ich keine Ahnung, ob es das geschielderte Ursprungsproblem löst, aber in Bezug auf
Zitat von Ykcim:
Ich habe zwar im TaskManager beobachtet, dass ich einen Speicher irgendwo nicht freigegeben habe, denn der Speicher ist bei jeder Abfrage von der ServerApp um ca. 3MB gestiegen.
bin ich optimistisch.
  Mit Zitat antworten Zitat