Lesen von SQL-Abfrageergebnisse in einer while-Schleife

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Lesen von SQL-Abfrageergebnisse in einer while-Schleife

Beitrag von niederrheiner »

Hallo an Alle,
ich habe nun ein neues Problem. Mit der nachfolgenden Code-Sequenz möchte ich Daten aus einer Datenbank ermitteln und am Bildschirm in einer Combobox anzeigen.

Die Abfrage selbst ist richtig und bringt auch die richtigen Ergebnisse.

Wenn ich nun das Programm starte erscheint die Messagebox mit dem Ersten Ergebnis. Nach drücken des OK-Buttons in der Messagebox erscheint wiederum die Messagebox, aber nicht mit dem erwarteten nächsten Ergebnis sondern wieder mit dem Ersten.

Erst nach drücken des OK-Buttons erscheint der nächste richtige Satz. Nach drücken des OK-Buttons sollte nun die Verarbeitng abgeschlossen sein, da nur zwei Ergebnissätze vorhanden sind. Es erscheint aber wieder die Messagebox mit dem zweiten Satz.

Nach nochmaligen drücken des OK-Buttons erscheint die Fehlermeldung:

Operation cannot performed on an inactive dataset

gefolgt von der Messagebox mit dem Ersten Datensatz.. Nach drücken des OK-Buttons erscheint die Messagebox mit dem Zweiten Datensatz, nach nochmaligen drücken des OK-Buttons ist die Verarbeitung scheinbar beendet und das Drücken des Cancel-Buttons der Fehlermeldung beendet das Programm.

Welcher logische/Denkfehler liegt hier vor? Habt Ihre irgendwelche Ideen?

Code: Alles auswählen

// Verbindung zur DB herstellen
     if MySQL50Connection2.Connected then
        MySQL50Connection2.Close;
 
     MySQL50Connection2.Open;
 
     if not MySQL50Connection2.Connected then
        begin
          ShowMessage('Keine Datenbankverbindung');
          Self.Close;
        end;
 
     // Comboboxen Monat fuellen
     sSQL:= 'SELECT date_format(g_datum,"%b") AS Monat FROM gesundheit GROUP BY month(g_datum);';
 
     SQLQUERY2.SQL.Clear;
     SQLQUERY2.SQL.Add(sSQL);
     SQLQUERY2.Prepare;
     SQLQUERY2.Open;
 
     SQLQUERY2.FindFirst;
 
     if SQLQuery2.RecordCount > 0 then
        if SQLQuery2.FieldCount > 0 then
           begin
                while not SQLQUERY2.EOF do
                begin
                     showmessage(SQLQuery2.fieldbyname('Monat').asString);
//                     DBComboBox_Monat.Items.AddStrings(sZw);
                     SQLQUERY2.Next;
                end;
                SQLQUERY2.Close;
                exit;
           end
     else
      begin
        showmessage('Keine Daten vorhanden');
        SQLQuery2.Close;
      end;
end;
Danke für Eure Hilfe und Tipps.

Bis dann ...
MfG
Günter

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Nach einem Open ist die Datenmenge normalerweise am Anfang. Damit ist eine Query.first eigentlich unnötig. Du verwendest aber ein FindFirst -> besonderen Grund dafür ?

Die Abfrage ob Daten vorhanden sind, wüde ich über "IF Query.BOF AND Query.EOF then .. " lösen, denn Beginn of File und End of File ist nur gleichzeitig gültig, wenn die Datenmenge leer ist.

Zum Problem, lass das FindFirst mal weg (oder stelle es auf "first" um).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

RecordCount = 0 ist wohl noch logischer.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Lesen von SQL-Abfrageergebnisse in einer while-Schleife

Beitrag von niederrheiner »

Hallo an Alle,

danke für Eure Antworten. Die tatsächliche Lösung hat mich nun doch etwas verwirrt. Nicht die Prüfung auf BOF und EOF hat zur Lösung des Problems geführt, sondern ein einfaches auskommentieren/löschen der showmessage-Anweisung zur Anzeige des Ergebnisses.

Ich habe zuerst Eure Lösungsvorschläge eingebaut und getestet, aber hat sich am Verhalten des Programmes nichts geändert. Dann habe ich ein paar showmessage zur Ablaufverfolgung eingebaut und es wurde nch wilder. Dann habe ich alle showmessage-Anweisungen, die nur zum Testen waren, entfernt, und siehe da das Programm arbeitet nun so wie ich mir vorstelle.

Greift showmessage so in den Programmablauf ein? Ein aktivieren der showmessage-Anweisung brachte wieder die alte Verhaltenweise. ??????????

Was soll ich davon halten?

Bis dann ...
MfG
Günter

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Solange du das nicht in einem Thread ausführst tut Showmessage da nix.
Der Unterschied ist das Timing. Ich weiss zwar nicht wie das in deinem fall zu solchem verhalten führen soll, aber das ist der einzige Unterschied den ich sehe.

Warum nimmst du nicht den Debugger zum debuggen ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Christian hat geschrieben:RecordCount = 0 ist wohl noch logischer.
Recordcount muss nicht ZWINGEND implementiert sein (ist virtual definiert, liefert nicht überschrieben einfach -1 zurück), weiters KANN eine Konsequenz sein, das erst mal alle Datensätze gefetcht werden müssen um festzustellen wieviele es sind. BOF und EOF werden bei der normalen Bewegung durch die Datenmenge bedient und somit ist es meistens wesentlich effizienter diese Zustände als Indikator für eine leere/vorhandene Datenmenge zu nehmen.

Logischer vielleicht dann, wenn man nicht in wirklichen Datenmengen arbeitet.

Interessant ist hier eher, warum diese Seiteneffekte mit dem showmessage.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten