Einzelnen Beitrag anzeigen

Monday

Registriert seit: 24. Aug 2012
103 Beiträge
 
FreePascal / Lazarus
 
#27

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 4. Aug 2018, 21:19
Erstmal vielen Dank für eure Antworten.

Ich habe gerade gesehen, dass mir bei dem Beitrag ein Fehler unterlaufen ist. Ausgerechnet die wichtigste Zeile fehlt:
temp := temp+100;

Dieser kommt am Schluss. Ich habe unten nochmal den überarbeiteten code angefügt.


"Form1." kann man selbstverständlich rausmachen.
"select id,*" - das * war nur zu anschauung. Ich würde auch nur die Felder wählen, die ich wirklich benötige.

Das mit der Fetch Funktion habe ich versucht. Entweder habe ich nicht verstanden wie es richtig geht, oder es geht nicht. Die Funktion wäre schon nice gewesen. Dann könnte ich mir den unteren code sparen; Weil dieser soll ja die Datensätze abschnittsweise einlesen. Aber ich denke, es lohnt sich, mich damit mal ausführlich auseinanderzusetzen.

Das mit .RecordCount habe ich rausgenommen. Ich dachte mit RecordCount wird die maximaldatensätzeanzahl angezeigt. Mit .RecNo wird die aktuelle Datensatz Nr angezeigt?

Hier der neue Code:

Delphi-Quellcode:
var
temp , stop, stopz, a: integer;

begin
// temp ist der "eigene Datensatz Zähler"
//temp := 0; //Anfang der ID's
stop := 0;

      ZQuery3.Close;
      ZQuery3.SQL.Clear;
      ZQuery3.SQL.Text := 'select min(id) as mm from tabelle1;';
      ZQuery3.Open;
      temp := StrToInt(ZQuery3.FieldByName('mm').AsString);

   ZQuery3.Close;
   ZQuery3.SQL.Clear;
   ZQuery3.SQL.Text := 'select max(id) as mm from tabelle1';
   ZQuery3.Open;
   stopz := ((StrToInt(ZQuery3.FieldByName('mm').AsString)-2));



 while stop = 0 do begin //Datensätze nur abschnittsweise laden
   ZQuery1.Close;
   ZQuery1.SQL.Clear;
   ZQuery1.SQL.Text := 'select id,* from tabelle1 where id >= "'+IntToStr(temp)+'" Limit 100;'; // Limit 100: Ggf. verkleinern
   ZQuery1.Open;


   if (stopz <= temp) then begin stop :=1; exit; end; // Wenn Ende erreicht von DB, dann Schleife beenden


  for a := 0 to stopz do begin
  // *** Hier die einzelnen Datensätze verarbeiten ***
  end; //for

temp := temp+100; // muss gleich sein wie bei Limit oben
 end; //while



end;

Geändert von Monday ( 5. Aug 2018 um 08:17 Uhr) Grund: Codekorrektur stop := 0 hinzugefügt
  Mit Zitat antworten Zitat