Entwickler-Ecke

Datenbanken - TQuery bei Bedarf Erzeugen und Zerstören?


JRegier - Do 16.06.05 07:42
Titel: TQuery bei Bedarf Erzeugen und Zerstören?
Hallo, ich bin an einem Projekt dran, wo ich mal nur eine TQuery brauche, mal Zwei und so bis sechs!
Ich hatte vorher alle schon fertig erstellt aber hat mir nicht gefallen da ich vieleicht evtl mal
aus einer Procedur die andere aufrufe die evtl auch dieselben TQuerys benutz und dann könnte ein Fehler
entstehen! Jetzt habe ich eine Unit "Utils" gemacht und solche proceduren um bei Bedarf welche zu erstellen
bzw. aufzuräumen!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
const ALIAS = '...';

function Q(AOwner) : TQuery;
var HQ : TQuery;
begin
    HQ := TQuery.Create(AOwner);
    HQ.DatabaseName := ALIAS;
    HQ.RequestLive := True;
    HQ.AutoRefresh := True;
    Result := HQ;
end;

procedure F(HQ : TQuery);
begin
    HQ.Close;
    HQ.UnPrepare;
    HQ.Free;
end;


Meine Frage ist nun: wird die Performace dadurch stark beeinträchtigt?


jasocul - Do 16.06.05 07:55

Großartig Performance-Probleme dürftest du nicht bekommen.
Ich mache das im Prinzip auch so.
Kleiner Tip:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function Q(AOwner) : TQuery;
begin
    Result := TQuery.Create(AOwner);
    with Result do begin
      DatabaseName := ALIAS;
      RequestLive := True;
      AutoRefresh := True;
    end;
end;


alzaimar - Do 16.06.05 08:07

Nur so: Ich verzichte auf die Angabe des Owners und gebe meine Queries dann eben selbst wieder frei. Is doch ok, oder?


jasocul - Do 16.06.05 08:50

@alzaimer:
Das mit dem Owner ist mir gar nicht aufgefallen. Ich übergebe auch meistens nil, da ich die Freigabe auch selbst steuere.
Fazit für dich: Damit gibts keine Probleme.


JRegier - Do 16.06.05 08:57

user profile iconjasocul hat folgendes geschrieben:
Großartig Performance-Probleme dürftest du nicht bekommen.
Ich mache das im Prinzip auch so.
Kleiner Tip:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function Q(AOwner) : TQuery;
begin
    Result := TQuery.Create(AOwner);
    with Result do begin
      DatabaseName := ALIAS;
      RequestLive := True;
      AutoRefresh := True;
    end;
end;


Ah, da hatte ich auch ne Frage zu Result Allgemein bzw. verlassen der Procedur!
Wie ist es in Delphi? Wenn die Anweisung mit Result abgearbeitet ist wird
die Procedur verlassen? In Java heist es return Wert und somit werden
die darunter stehende Anweisungen nicht mehr ausgeführt!


jasocul - Do 16.06.05 09:08

Ist ja eigentlich eine ganz neue Frage, aber ich bin mal nicht so (Ich hoffe, die Mods haun diesmal nicht so doll).
In Delphi ist das nicht so.
Da kannst du Result einen Wert zuweisen und den in der Funktion benutzen. Früher (anno tobak) gab es die Variable Result nicht. Da musste dem Funktionsnamen das Ergebnis übergeben werden. Daher musste man sich Variablen in der Prozedur definieren, dass bei intensiver Nutzung der Funktion wohl zu Performance-Problemen geführt haben soll.
Es geht auch heute noch so, dass man dem Funktionsnamen das Ergebnis übergeben kann. Nur dann den Funktionsnamen zur weiteren Bearbeitung zu benutzen, würde zu rekursiven Aufrufen der Funktion führen. Daher hat man dann due Variable Result eingeführt.


JRegier - Do 16.06.05 09:28

user profile iconjasocul hat folgendes geschrieben:
Da musste dem Funktionsnamen das Ergebnis übergeben werden.


Also im Klartext wenn ich dem Prozedurnamen den Wert übergibt wird die Prozedur dann verlassen?
Oder wird Prozedurname gar nicht mehr genutzt!


jasocul - Do 16.06.05 09:38

Die Funktion wird beim "end" verlassen und nicht bei der Wertübergabe.


JRegier - Do 16.06.05 09:42

user profile iconjasocul hat folgendes geschrieben:
Die Funktion wird beim "end" verlassen und nicht bei der Wertübergabe.


Oh man dann muß man ja aufpassen das was ungewolltes Passiert! Alles darunter!
Und was geschieht genau bei Wertübergabe, wird die aufrufende Prozedur dann schon weiter abgearbeitet "Thread"
oder erst wenn die aufgerufene Prozedur bei "end" verlassen wurde?


jasocul - Do 16.06.05 09:50

Die Übergabe der Daten wird erst mit dem Ende der Funktion durchgeführt. (kein Thread-ähnliches Verfahren)


Stefan.Buchholtz - Do 16.06.05 09:53

user profile iconJRegier hat folgendes geschrieben:
user profile iconjasocul hat folgendes geschrieben:
Die Funktion wird beim "end" verlassen und nicht bei der Wertübergabe.


Oh man dann muß man ja aufpassen das was ungewolltes Passiert! Alles darunter!
Und was geschieht genau bei Wertübergabe, wird die aufrufende Prozedur dann schon weiter abgearbeitet "Thread"
oder erst wenn die aufgerufene Prozedur bei "end" verlassen wurde?


Die aufrufende Prozedur wird erst weiter abgearbeitet wenn deine Funktion bei end verlassen wird.
Result kannst du in einer Funktion wie eine normale lokale Variable verwenden, der Inhalt von Result beim Verlassen der Funktion ist dann der Rückgabewert. Das ist so, als wenn du in Java sowas schreiben würdest:


Quelltext
1:
2:
3:
4:
5:
6:
7:
int meineFunktion(void) {
  int result;

  // irgendwas mit result machen

  return result;
}


Um eine Delphi-Prozedur oder -Funktion vorzeitig zu verlassen, nimmst du exit.

Stefan


JRegier - Do 16.06.05 10:18

user profile iconStefan.Buchholtz hat folgendes geschrieben:


Quelltext
1:
2:
3:
4:
5:
6:
7:
int meineFunktion(void) {
  int result;

  // irgendwas mit result machen

  return result;
}



oder in Delphi wie in Java


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function XY(...) : Integer;
var TT : Integer;
begin
   case HUHU of
   cc: begin
       Result := TT+10;  // Result und Exit zusammen!
       Exit;
       end;
   dd: begin
       Result := TT*10;
       Exit;
       end;
   end;
end;