kralle hat geschrieben: Mi 26. Jul 2023, 07:37
Moin,
wenn ich mittels
Code: Alles auswählen
SQLQuery1.SQL.Text:='SELECT * FROM jos311_jdownloads_files_backup_3_2_69;';
Daten filtere und in einem DBGrid anzeigen lasse, dann gibt es Probleme beim Scrollen.
Wie gladio schon ausführte, filtert dieses SQL Statement gar nichts.
Ohne WHERE Klausel gibt es keinen Filter, du forderst einfach nur alle Spalten und alle Zeilen einer Tabelle auf einmal an.
In der Welt von SQL-Datenbanken ist das einfach schlechter Stil.
Man holt tatsächlich nur die Felder und die Zeilen die man wirklich braucht.
Das ist einfach eine andere Art zu denken, denn der tatsächliche Performance-Killer (wenn mit Indizes und anderen Methoden sichergestellt ist dass das Statement schnell ist) ist das Übertragen der angeforderten Daten.
Es gibt in meinen Applikationen praktisch KEIN Statement ohne Where-Klausel und
SELECT * ist ebenso verbannt.
Bei ZEOS gibt es für solche Gelüste die komplette Tabelle zu holen die Komponente TZTable. Ein Äquivalent dazu existiert meines Wissens in SQLDB nicht.
Als Test würde ich deinem Statement mal eine WHERE Klausel verpassen, vielleicht kennt sich die Komponente dann besser aus.
Ich merke gerade, selbst beim Schreiben des Statements verkrampft es meine Finger
Exception class "EDatabaseError" at $00000000007A9D67 with message "Operation cannot be performed on an unidirectional dataset"
Es existieren unterschiedliche Varianten wie Daten vom SQL-Server angefordert werden können - unidirektional und bidirektional. Der Grid braucht einen bidirektionalen Modus.
Scheinbar ist da irgendetwas in der Komponentenkette von der DB-Verbindung zum Grid (inkl. des SQL Statements) nicht ganz in Ordnung eingestellt.
Teste das mal in einem neuen Projekt mit den Standardeinstellungen.
kralle hat geschrieben: Mi 26. Jul 2023, 07:37
Nebenbei gefragte: Wenn ich ein
nutze, wo finde ich die Anzahl der gefundenen Treffer?
Die Frage ist unvollständig gestellt. Denn der Zeitpunkt der Fragestellung ist entscheidend.
Die angeforderten Daten werden in der TSQLQuery zwischengespeichert um sie dem Grid anzubieten. Aber nicht alle Daten auf einmal, die werden Blockweise abgeholt und nur diejenigen Daten retrieved die der Grid gerade braucht.
Zu diesem Zeitpunkt "weiß" TSQLQuery noch nicht wie viele Records noch kommen.
Erst ein TSQLQuery.Last fetcht alle Daten, danach kann man mit TSQLQuery.RecordCount deren Anzahl ermitteln. Macht nur Sinn wenn die Datenmenge übersichtlich ist und ich die Daten danach ohnedies brauche.
Eine andere Variante ist (ungetestet) TSQLQuery.RowsAffected die scheinbar unabhängig vom Fetch-Stand den SQL-Cursor abfragt wieviele Record betroffen sind. Denn der sollte das ja wissen.
Falls ich eine sehr große Ergebnismenge erwarte (was ich unter allen Umständen zu vermeiden suche) frage ich direkt die Datenbank mit einem eigenen SQL-Statement.