Hallo,
je nach Datenbank kann ein len:=RecordCount lange dauern, da zuweilen die Datensätze wirklich gezählt werden, d.h. die Datenmenge wird einmal durchlaufen (egal ob auf dem Client oder dem Server). Einige Datenbanken liefern die ersten Sätze der Ergebnismenge ja schon aus, bevor das gesamte Ergebnis der Abfrage feststeht, d. h.: Du liest die ersten Daten schon, während die Datenbank noch mit dem Ermitteln der Ergebnismenge beschäftigt ist. Möchtest Du nun wissen, mit wievielen Sätzen Du zu rechnen hast, muss die Datenbank die Ergebnismenge vollständig "zusammen" haben.
Ob's bei Dir so ist, kann ich nicht sagen.
Versuche mal vorher ein Select Count(*) entsprechend Deinem Select zu machen und nehme für len diesen Wert, statt RecordCount.
Der Record besteht sicherlich nicht nur aus nachname. Wieviel Byte an Daten hat ein Record, wieviel gibt das mal 100000? Reicht der Arbeitsspeicher oder muss ausgelagert werden. Dann wird es immer deutlich langsamer. Wenn's wirklich an der Laune des Computers und der laufenden Programme liegt, dann sorg' mal für mehr Arbeitsspeicher. Schau Dir im Taskmanager mal die "Speicherentwicklung" beim Programmstart an und eventuell auch mal die Grafiken über CPU-Belastung und Speichernutzung.
Warum so?
Delphi-Quellcode:
len:=0;
while len<RecordCount do
begin
with personenArray[len] do
begin
nachname:=Fields.Fields[0].AsString;
end;
next;
len:= len+1;
end;
Wäre eventuell auch
Delphi-Quellcode:
first;
len:=0;
while not EoF do
begin
with personenArray[len] do
begin
nachname:=Fields.Fields[0].AsString;
end;
next;
len:= len+1;
end;
möglich?
Ich weiß nicht, wie RecordCount intern funktioniert, ob es wirklich nur ein Wert ist, der einmalig zugewiesen wird oder eine Funktion im Getter, die bei jedem Zugriff die Anzahl der Datensätze ermittelt. Eine Alternative könnte also sein:
Delphi-Quellcode:
// Funktion
with query do
begin
with sql do
begin
clear;
add('
<SELECT Anweisung>');
end;
open;
// first; // bei open sollte man schon auf dem ersten Satz stehen.
satzzahl := RecordCount;
setLength(personenArray,satzzahl);
len:=0;
while len < satzzahl
do
begin
with personenArray[len]
do
begin
nachname:=Fields.Fields[0].AsString;
end;
next;
Inc(len);
end;
end;