Announcement

Collapse
No announcement yet.

Füllen von TDBComboBox aus einer Datenbank sehr langsam

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Füllen von TDBComboBox aus einer Datenbank sehr langsam

    Ich bin dabei, ein altes (und noch immer produktiv eingesetztes) Delphi 4-Projekt aus dem Jahr 2001 mit Delphi 10.4 neu zu erstellen.

    Mein Problem:
    In einem Form soll beim Öffnen eines Fensters eine TDBComboBox mit Werten aus einer SQL-Tabelle gefüllt werden.
    Unter Delphi 10.4 dauert das Öffnen des Fensters beinahe 30 Sekunden. Im alten (Delphi 4-Projekt) sind es keine 2 Sekunden... beide Programme werden hier auf dem selben Rechner unter Windows 10 ausgeführt. In beiden Fällen wird in der Wartezeit die "SQL-Sanduhr" angezeigt, das ist also ein Hinweis auf eine stattfindende Datenbanktätigkeit.

    Hinweis 1:
    Durch Auskommentieren der verschiedenen Aktionen im FormShow konnte ich sicherstellen, dass der Übeltäter der weiter unten folgende Source-Teil ist.

    Hinweis 2:
    Im alten Projekt handelt es sich um Postgresql 9.4, im neuen 13.1... ich glaube aber nicht, dass mein Problem etwas mit dem Datenbank-Backend zu tun hat.

    Hinweis 3:
    Die Komponente für den Datenbankzugriff ist in beiden Fällen ZEOSdbo - 5.? beim alten, 7.2.10 beim neuen Projekt.

    Hinweis 4 (der IMHO Wichtigste):
    Als ich beim Ausführen der neuen (mit Delphi 10.4 erzeugten) Exe zufällig den Mauszeiger in die Windows Task-Bar bewegt habe, wurde das Fenster zu meiner Überraschung sofort angezeigt. Der Fehler hat IMHO also irgendetwas mit dem vorhandenen Focus auf das Fenster der exe zu tun (?)

    Quellcode der problematischen Funktion (steht in FormShow):

    Code:
    // ***************************************
    // Hersteller für DBComboBox suchen
    // ***************************************
    with qyHersteller do
    begin
      Close;
      with SQL do
      begin
        Clear;
        Add('SELECT DISTINCT hersteller FROM prueflinge');
        Add('ORDER BY hersteller');
      end;
      Open;
    end;
    
    // ***************************************
    // Hersteller in DBComboBox eintragen
    // ***************************************
    HerstBuffer := TStringList.Create;
    
    while not qyHersteller.Eof do
    begin
      cHersteller := Trim(qyHerstellerHersteller.AsString);
      if cHersteller <> '' then
        HerstBuffer.Add(cHersteller);
      qyHersteller.Next;
    end;
    
    // dbcoHersteller.Items.BeginUpdate;
    dbcoHersteller.Items.Clear;
    dbcoHersteller.Items := HerstBuffer;
    // dbcoHersteller.Items.EndUpdate;
    
    FreeAndNil(HerstBuffer);
    (Die Idee, die ComboBox über eine StringList zu füllen, habe ich aus dem Netz - das macht aber bzgl. der Ausführungsgeschwindigkeit keinen Unterschied...)

    Auch die Verwendung / Nicht-Verwendung von BeginUpdate und EndUpdate macht leider keinen Unterschied in der Ausführungsgeschwindigkeit... das war meine erste Idee, bringt aber leider nichts.

    Meine Frage:
    Was mache ich falsch???

    Ich freue mich auf jede Antwort - bitte entschuldigt, dass ich nach all den Jahren etwas "eingerostet" bin!

    Ralph
    Zuletzt editiert von Ralph Staudte; 11.02.2021, 01:31.
Working...
X