AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Funktion mit TQuery als Rückgabewert
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion mit TQuery als Rückgabewert

Ein Thema von bogdan · begonnen am 3. Nov 2013 · letzter Beitrag vom 4. Nov 2013
Antwort Antwort
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#1

Funktion mit TQuery als Rückgabewert

  Alt 3. Nov 2013, 13:13
Datenbank: mySQL • Version: 5.x • Zugriff über: Zeos
Ich benutze die Zeos Komponenten für SQL Abfragen.

SQL Statement soll in einer Funktion ausgeführt und das Ergebnis als TQuery weiter gegeben werden.

Also so in etwa:

Delphi-Quellcode:
function SQLSelect(SQLtxt: String):TZReadOnlyQuery;
var xQuery : TZReadOnlyQuery;
begin
  xQuery := TZReadOnlyQuery.Create(nil);
  xQuery.Connection := ZConnection1;
  xQuery.SQL.Clear;
  xQuery.SQL.Add(SQLtxt);
  if ZConnection1.Connected then
  begin
    xQuery.Open;
    xQuery.Active := True;
  end else ShowMessage('Keine Datenbankverbindung!');
  Result := xQuery;
end;
So bläht sich aber das Query mit jeder neuen SQL Abfrage auf und dann ist der Speicher voll.
Das Aufblähen könnte ich mit FreeAndNil(xQuery); am Ende der Funktion beheben.

Das Problem ist nur: der Rückgabewert ist dann auch immer leer.

Array, Strings, etc. als Rückgabewert wollte ich eigentlich nicht nutzen, da die Daten dann nochmal aus der Query in das Array, etc. geschrieben werden müssen. Ist doch irgendwie doppelt-gemoppelt.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Funktion mit TQuery als Rückgabewert

  Alt 3. Nov 2013, 13:19
Irgend jemand muss halt die Queries wieder aufräumen/freigeben.
Bei deinem Ansatz wäre es die aufrufende Funktion/Methode.

Hier wäre es aber günstig wenn der Funktionsname darauf hinweist das eine Objekt/Instanz erzeugt wird die man als Aufrufender auch wieder aufräumen muss.
Also z.B. CreateQueryBySQL(...)
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Funktion mit TQuery als Rückgabewert

  Alt 3. Nov 2013, 13:34
Was spricht dagegen ein Datenmodul zu nehmen und darauf so viele verschiedene Queries zu platzieren wie du brauchst?
Dynamisch erzeugte Queries benötigt man nur in Sonderfällen.
Und selbst dann kann man das gleiche Query-Objekt immer wieder benützen (mit jeweils anderem SQL-Text).
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Funktion mit TQuery als Rückgabewert

  Alt 3. Nov 2013, 13:57
Wenn man den obigen Vorschlag mit dem Datamodul nimmt, dann könnte man eine procedure mit den Rückgabewerten "SQL_String", "Active", "ReadOnly" nehmen. Das sollte auch flotter Laufen, als das Objekt Auf- und Abbauen.

Grüße in die Runde // Martin
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Funktion mit TQuery als Rückgabewert

  Alt 4. Nov 2013, 07:44
Und selbst dann kann man das gleiche Query-Objekt immer wieder benützen (mit jeweils anderem SQL-Text).
Zur Informationsbeschaffung ja, zur Anzeige nur bedingt. Da muss man sich dann etwas anderes einfallen lassen (TClientDataset z.B.)
Wenn man den obigen Vorschlag mit dem Datamodul nimmt, dann könnte man eine procedure mit den Rückgabewerten "SQL_String", "Active", "ReadOnly" nehmen. Das sollte auch flotter Laufen, als das Objekt Auf- und Abbauen.
Die Sache mit den Rückgabewerten könntest Du bitte dann doch etwas näher erläutern. Und wie langsam ist eigentlich das Instantiieren und Freigeben einer Query in etwa? Kannst Du das mal ausmessen (z.B. 100000 mal Create/Free)? Danke.

Geändert von Furtbichler ( 4. Nov 2013 um 07:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Funktion mit TQuery als Rückgabewert

  Alt 4. Nov 2013, 07:58
Das Erzeugen einer Query-Instanz geht sehr flott und macht kaum einen Unterschied ob wiederverwendet oder neu erzeugt.

Bei einer Connection sieht das anders aus, weil ja jedes Mal die Verbindung neu aufgebaut werden muss.

Hier wäre mE auch der Vorschlag mit dem TClientDataset am sinnvollsten.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 22:07 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