Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi UniDac Query Daten ohne schleife lesen (https://www.delphipraxis.net/203088-unidac-query-daten-ohne-schleife-lesen.html)

DelTurbo 11. Jan 2020 12:16

Datenbank: MySql • Version: 5.x • Zugriff über: UniDac 5.3.8

UniDac Query Daten ohne schleife lesen
 
Hallo,
ich habe eine Frage. Ich hole viele Datensätze aus einer MySql. Diese Daten sind Strings und sollen in eine TStringliste.
Nun mache ich das so wie eigentlich immer. In einer schleife Datenstatz holen und mit .Add(Query.fieldByName('xx').Asstring) hinzufügen. Dann Query.Next bis Query.Eof erreicht ist.

Nun habe ich mich gefragt ob es nicht etwas gibt, damit ich z.b. entweder mit TStringlist.AddStrings oder TStringlist.Assign arbeiten kann.
Also ich möchte die Schleife los werden.

Leider finde ich da nix. Gibt es da eine Möglichkeit?

Vielen dank im Voraus

p80286 11. Jan 2020 13:00

AW: UniDac Query Daten ohne schleife lesen
 
Zunähst einmal nein, da das ergebnis einer Query eine Menge ist.
U.u gibt es eine Möglichkeit tiefer aufzusetzen und aus den indizierten Feldern, also nicht byName etwas zu basteln. Vorraussetzung ist dafür aber, das alle Datensätze, also das vollständige Dataset vorliegen. Das .Next ist ja nicht nur für das iterieren durch die Daten zuständig sondern fordert auch ggf den nächsten/die nächsten Datensätze von der DB an.

Gruß
K-H

jobo 11. Jan 2020 13:05

AW: UniDac Query Daten ohne schleife lesen
 
also die Schleife muss irgendwo geschehen, aber eine elegante Möglichkeit dürfte eine Aggregatfunktion in der Abfrage sein.
Je nach mysql kann man mit group_concat anfangen und einen "fetten" String auslesen, den man dann mit add anfügt. Das simpelste ist dabei die reinen Einzelwerte abzugreifen ohne ID oder Zuordnung.
Ab mysql 8 kann man auch mit json aggregat Funktionen etwas aufwendigere Strukturen auf diese Weise einsammeln. Bin nicht uptodate, wie elegant es damit in Delphi weitergehen kann ..

z.B.
Code:
SELECT
  tableid AS id,
  JSON_ARRAYAGG(tablevalue) AS values
FROM mytable
WHERE ..
GROUP BY tableid;

DelTurbo 11. Jan 2020 13:08

AW: UniDac Query Daten ohne schleife lesen
 
Ja, aber er (UniDac) hat ja alle Daten irgenwo im Speicher. Ich dachte dort kommt man dran.
Ich würde, wenn ich wüsste das es schneller ist, sogar auf den Index gehen. Also Query.Fields.Field[0]. Dann muss man zwar wissen wo was ist, und es ist nicht flexible.

Aber für geschweindigkeit mache ich ja fast alles. :)

@jobo,
hast du da mal eine abfrage beispiel. Meine Daten hole ich im moment so.
Beispiel: Select Datenfeld FROM tabelle WHERE is_used;

jobo 11. Jan 2020 13:09

AW: UniDac Query Daten ohne schleife lesen
 
s.o. sorry, hab das nachträglich ergänzt

also das wären natürlich noch mehrere Datensätze
Code:
SELECT
  tableid AS id,
  JSON_ARRAYAGG(tablevalue) AS values
FROM mytable
WHERE ..
GROUP BY tableid;
Nimmt man die ID raus, kommt natürlich nur noch eine Zeile raus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 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