For 1 to RecordCount ist schlicht und einfach eine schlechte Idee, egal welche Datenbankkomponente genutzt wird.
Je nach Datenbank und Komponente werden die Datensätze geliefert, sobald sie zur Verfügung stehen, das heißt aber nicht, dass beim Liefern der ersten Datensätze bereits bekannt ist, wieviele Datensätze überhaupt insgesamt geliefert werden (könnten).
Willst Du vorab die exakte Datensatzzahl wissen, musst Du zuerst ein
Query.Last machen. Das kann dann dauern und braucht ggfls. auf Client- und/oder Serverseite viel Speicher.
Je nach Datenbankkomponente und/oder Konfiguration kann über ein Fetchattribut bestimmt werden, wieviele Datensätze "am Stück" geholt werden sollen. Steht das z. B. auf 100, so werden nur die ersten 100 Datensätze geholt und RecordCount steht dann auf 100. Per While not EoF wird beim ersten Next hinter dem 100. Datensatz gemerkt: "
Oh, da ist ja noch was!" Dann werden die nächsten 100 Sätze geholt und RecordCount "wächst" auf 200 ...
Erst wenn bei einem Next die Info von der Datenbank kommt: "Mehr hab' ich nicht!" ist EoF erreicht und die While not EoF-Schleife wird beendet. Nur so bekommst Du verlässlich alle Datensätze.
Je nach Datenbank und/oder Clientkonfiguration kann es auch sein, dass für die Übermittlung der Daten eine bestimmte Menge Speicher reserviert wird. Ist der voll, wird die Datenübertragung (vorerst) beendet, bis per Next der erste Datensatz "hinter" der bereits gelieferten Datenmenge angefordert wird. Dann kommt der nächste "Schub" Datensätze und RecordCount "wächst" auf die nun gelieferte Gesamtmenge an Datensätzen.
Wenn Du bisher mit For x := 1 to RecordCount immer alle Datensätze bekommen hast, hast Du eher Glück gehabt. Eine sichere Verarbeitung aller Datensätze hast Du so aber sicherlich nicht programmiert.
Alle Datensätze bekommst Du nur mit While not EoF oder Repeat until EoF.
Das von himitsu genannte FetchAll entspricht sinngemäß einem:
Delphi-Quellcode:
qry.Open;
qry.Last;
qry.First;
Dann hast Du alle Datensätze und RecordCount dürfte damit auf der tatsächlich zu erwartenden Anzahl von Datensätzen stehen.
Und wenn Du in X unbedingt wissen muss, um welchen Datensatz es sich handelt, dann nimm einfach x := qry.RecNo, damit hast Du bereits einen Datensatzzähler und musst ihn nicht extra nochmal per for x := 1 to WasWeißIchWieviel, auf eher unzuverlässige Weise, nachbilden.