Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi CSV Export eines ADOQueries beschleunigen (https://www.delphipraxis.net/143880-csv-export-eines-adoqueries-beschleunigen.html)

slemke76 25. Nov 2009 11:53

Datenbank: MSSQL • Version: egal • Zugriff über: ADO

CSV Export eines ADOQueries beschleunigen
 
Hallo zusammen,

ich speichere im Moment das Ergebniss eines Queries wie folgt in einer CSV Datei:

Delphi-Quellcode:
  sl := TStringList.Create;
  try
    with AdoQuery do
    begin
      First;
      // - Alle Datensätze durchlaufen -
      while not (Eof) do begin
        inc(count);
        tString := '';
        // - Alle Felder eines Datensatzes durchgehen -
        for ndx := 0 to Fields.Count -1 do begin
          // Gleichzeitig trim !
          tString := tString + '"' + trim(Fields.Fields[ndx].AsString) + '";';
        end;
        sl.Add(tString); // Ab in die Stringliste
        Next;
      end;
    end;
    sl.SaveToFile(File2Use); // Und auf die Pladde ;-)
  finally
    FreeAndNil(sl);
  end;
end;
Problem ist nun, dass das ganze nicht besonders schnell ist - es ist ganz in Ordnung, aber z.B. adoquery.savetofile ist viel viel viel schneller - das Dateiformat passt halt leider nicht.

Hat jemand eine Optimierungsidee ?

lg
Sebastian

hoika 25. Nov 2009 12:29

Re: CSV Export eines ADOQueries beschleunigen
 
Hallo,

ist der cursor client oder serverseitig.

Setze mal vor dem First noch ein Last (bei client cursor).

Hier noch ein interssanter Link

1
Gerade das, wass von Andreas Kosch kommt.


Heiko

slemke76 25. Nov 2009 13:31

Re: CSV Export eines ADOQueries beschleunigen
 
Hi !

wow - das ist mal schnelle Hilfe :-)
Habe jetzt AdoQuery.CursorLocation:=clUseClient; gesetzt - mit Erfolg ! Das ganz läuft spürbar schnller !

Vielen Dank!

lg
Sebastian

hoika 25. Nov 2009 14:14

Re: CSV Export eines ADOQueries beschleunigen
 
Hallo,

tja, wir sind ja von der schnellen Sorte.

Das Read-Only setzen könntest du auch noch ausprobieren.


Heiko

slemke76 25. Nov 2009 15:03

Re: CSV Export eines ADOQueries beschleunigen
 
Hi!

ist das eine TAdoquery Eigenschaft ? Ich sehe die irgendwie nicht :gruebel:

lg

alzaimar 25. Nov 2009 15:46

Re: CSV Export eines ADOQueries beschleunigen
 
Wenn die Query mit datensensitiven Steuerelementen verbunden ist (TDBEdit, TDBGrid o.ä.) bringt das Einschließen in einen 'DisableControls/Enablecontrols' block sehr viel Performance, da die Daten bei jedem 'Next' nicht neu gezeichnet werden müssen.
Delphi-Quellcode:
MyQuery.DisableControls;
Try
  MyQuery.First;
  While not MyQuery.Eof do Begin
  ...
    MyQuery.Next;
  End;
Finally
  MyQuery.EnableControls;
End;
Eigentlich sollte man die aktuelle Position des Datensatzzeigers mitspeichern, damit die durch die Schleife vorgenommene Verschiebung Desselben rückgängig gemacht wird.
Delphi-Quellcode:
Var
  BookMark : TBookmark;

Begin
  MyQuery.DisableControls;
  BookMark := MyQuery.GetBookmark(); // Heißt das so?
  Try
    MyQuery.First;
    While not MyQuery.Eof do Begin
    ...
      MyQuery.Next;
    End;
  Finally
    MyQuery.GotoBookmark(Bookmark);
    MyQuery.FreeBookmark(Bookmark);
    MyQuery.EnableControls;
  End
End

slemke76 25. Nov 2009 15:55

Re: CSV Export eines ADOQueries beschleunigen
 
Hi!

Zitat:

Zitat von alzaimar
Wenn die Query mit datensensitiven Steuerelementen verbunden ist (TDBEdit, TDBGrid o.ä.) bringt das Einschließen in einen 'DisableControls/Enablecontrols' block sehr viel Performance, da die Daten bei jedem 'Next' nicht neu gezeichnet werden müssen.

Ok, gut zu wissen, ist aber in diesem Fall nicht gegeben - es handelt sich um ein kleines Hilfs-Tools, das nur den CSV Export macht und nicht mit Steuerelementen verknüpft ist.

lg
Sebastian

hoika 26. Nov 2009 08:17

Re: CSV Export eines ADOQueries beschleunigen
 
Hallo,

hm vergiss Read-Only.
Das ist eine AdoQuery wohl von Haus aus,
zum Ändern gibt es ja TAdoDataSet.

Du könntest höchstens versuchen, eine eigene Transaktion zu nehmen
und versuchen, das Read-Only in den Properties einzustellen,
das st aber Server-Abhängig,
musst also bei MS-SQL suchen, ob es sowas gibt.

Zu DisableControls.
Ich habe das noch nie gebraucht,
weil ich für Anzeige eh ein normales StringGrid (oder was anderes benutze)
und Lesen und Schreiben über getrennte Komponenten oder läuft.


Heiko

Bernhard Geyer 26. Nov 2009 08:20

Re: CSV Export eines ADOQueries beschleunigen
 
Am besten noch einen Fordward-Only Curser verwenden um bei großen Ergebnismengen kein Speicherproblem zu bekommen.


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