Merkwürdiges Verhalten

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
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

Merkwürdiges Verhalten

Beitrag von niederrheiner »

Hallo an Alle,
folgende Codesequenz zeigt ein Verhalten, mit dem ich nicht gerechnet habe.
Die Anzeige Recordcount = 4 und Fieldcount = 1 sind korrekt. Doch dann wird es für mich merkwürdig. Es werden nicht die 4 Werte angezeigt, sondern die whlie-Schleife wird übergangen, EOF ist wohl eingetreten ??????
Kommentiere ich nun das erste showmessage aus wird mir in der While-Schleife der erste Wert angezeigt. Danch erscheint aber die Fehlermeldung

Code: Alles auswählen

Operation cannot be performed on an inactive dataset
Kommentiere ich nun auch das zweite showmessage aus wird in der While-Schleife auch der zweite Wert angezeigt. Danach erfolgt dann die obige Fehlermeldung.

Code: Alles auswählen

sqllebensmittel.Close;  
  sqllebensmittel.SQL.Text := 'SELECT naehrName FROM tblNaehrwerte';
  sqllebensmittel.Open;
 
  showmessage(inttostr(sqllebensmittel.RecordCount));
  showmessage(inttostr(sqllebensmittel.FieldCount));
  while not sqllebensmittel.EOF do begin
  //for j := 0 to sqllebensmittel.RecordCount - 1 do begin
    showmessage(sqllebensmittel.Fields[0].AsString);
    sqllebensmittel.Next;
  end;
Scheinbar ???? habe ich nur zwei Zugriffe frei, danach ist Schluß.
Kann mir einer von Euch dieses Verhalten erklären?

Bis dann ...
MfG
Günter

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Merkwürdiges Verhalten

Beitrag von Maik81ftl »

niederrheiner hat geschrieben:Hallo an Alle,
folgende Codesequenz zeigt ein Verhalten, mit dem ich nicht gerechnet habe.
Die Anzeige Recordcount = 4 und Fieldcount = 1 sind korrekt. Doch dann wird es für mich merkwürdig. Es werden nicht die 4 Werte angezeigt, sondern die whlie-Schleife wird übergangen, EOF ist wohl eingetreten ??????
Kommentiere ich nun das erste showmessage aus wird mir in der While-Schleife der erste Wert angezeigt. Danch erscheint aber die Fehlermeldung

Code: Alles auswählen

Operation cannot be performed on an inactive dataset
Kommentiere ich nun auch das zweite showmessage aus wird in der While-Schleife auch der zweite Wert angezeigt. Danach erfolgt dann die obige Fehlermeldung.

Code: Alles auswählen

sqllebensmittel.Close;  
  sqllebensmittel.SQL.Text := 'SELECT naehrName FROM tblNaehrwerte';
  sqllebensmittel.Open;
 
  showmessage(inttostr(sqllebensmittel.RecordCount));
  showmessage(inttostr(sqllebensmittel.FieldCount));
  while not sqllebensmittel.EOF do begin
  //for j := 0 to sqllebensmittel.RecordCount - 1 do begin
    showmessage(sqllebensmittel.Fields[0].AsString);
    sqllebensmittel.Next;
  end;
Scheinbar ???? habe ich nur zwei Zugriffe frei, danach ist Schluß.
Kann mir einer von Euch dieses Verhalten erklären?

Bis dann ...
MfG
Günter
:D kenn ich doch aus meinen Lieblingsfehlern. wenn ich das recht versteh, ist Recordcount = 4 das Maximun deiner FIle. und Demzufolge mus ja auch ein EOF auslösen.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Merkwürdiges Verhalten

Beitrag von Bora4d »

Platziere vor der Schleife:
sqllebensmittel.First;

Ich glaube mit sqllebensmittel.RecordCount werden alle Zeilen durchlaufen um Datenanzahl (=Recordcount) zuzählen.

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

Re: Merkwürdiges Verhalten

Beitrag von niederrheiner »

Hallo Maik81ftl,
Danke für Deine Antwort.
Die Anzahl Records ist auch richtig. Von den vier möglichen Records zeigt er mir aber nur die Ersten Zwei an und dann kommt schon EOF. Nach meinem Verständnis müsste dreimal das SQL.Next ausgeführt werden, bevor es zum EOF kommt. Oder Habe ich da was falsch verstanden? :(

Bis dann ...
MfG
Günter

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

Re: Merkwürdiges Verhalten

Beitrag von niederrheiner »

Hallo Bora4d,
Danke für Deine Antwort.
Dein Tipp hat leider keine Besserung gebracht. :(

Bis dann ...
MfG
Günter

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Merkwürdiges Verhalten

Beitrag von Bora4d »

niederrheiner hat geschrieben:Hallo Bora4d,
Danke für Deine Antwort.
Dein Tipp hat leider keine Besserung gebracht. :(

Bis dann ...
MfG
Günter
Dann müssen die Komponenten fehlerhaft sein. Wenn ein SQL-Query Werte zurückliefert dann muss das funktionieren:

Code: Alles auswählen

sqllebensmittel.First;
  while not sqllebensmittel.EOF do begin
  //for j := 0 to sqllebensmittel.RecordCount - 1 do begin
    Memo1.Lines.Add(sqllebensmittel.Fields[0].AsString);
    sqllebensmittel.Next;
  end;
Verwende mal Memo-Komponeten um Werte anzuzeigen.
Welche DB-Komponenten verwendest du? Ich würde immer ZEOS-Komponeten verwenden die werden von tausenden von Entwicklern (vor allem in Delphi) verwendet, deshalb fallen da BUGS schneller auf.

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

Re: Merkwürdiges Verhalten

Beitrag von niederrheiner »

Hallo Bora4d,
Danke für deine Antwort.
Scheinbar ist das Problem gelöst. Mit einem Memofeld werden alle Werte korrekt angezeigt. :o Diese Schleife von mir sollte eigentlich nur zur Überprüfung der SQL-Anweisung dienen.
Wieso aber diese unterschiedliche Verhalten bei showmessage und memo? Das verstehe ich nicht. In beiden Fällen wird doch mittels sql.next durch den Ergebniscursor navigiert. Hat etwa showmessage
irgendwelche Seiteneffekte?

Zu Deiner Frage nach den DB-Komponenten. Ich benutze die Komponenten die von Lazarus bereitgestellt werden (TMySQL50Connection ...).

Was hat es mit den ZEOS-Komponeten aufsich? Ich kenne sie nicht und sind sie Open-source?

Bis dann ...
MfG
Günter
Bora4d hat geschrieben:
niederrheiner hat geschrieben:Hallo Bora4d,
Danke für Deine Antwort.
Dein Tipp hat leider keine Besserung gebracht. :(

Bis dann ...
MfG
Günter
Dann müssen die Komponenten fehlerhaft sein. Wenn ein SQL-Query Werte zurückliefert dann muss das funktionieren:

Code: Alles auswählen

sqllebensmittel.First;
  while not sqllebensmittel.EOF do begin
  //for j := 0 to sqllebensmittel.RecordCount - 1 do begin
    Memo1.Lines.Add(sqllebensmittel.Fields[0].AsString);
    sqllebensmittel.Next;
  end;
Verwende mal Memo-Komponeten um Werte anzuzeigen.
Welche DB-Komponenten verwendest du? Ich würde immer ZEOS-Komponeten verwenden die werden von tausenden von Entwicklern (vor allem in Delphi) verwendet, deshalb fallen da BUGS schneller auf.

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Merkwürdiges Verhalten

Beitrag von Teekeks »

Die ZEOS Komponenten sind sehr mächtig bei allem was SQL betrifft.
Finden kannst du sie hier: http://wiki.lazarus.freepascal.org/Zeos_tutorial/de

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Merkwürdiges Verhalten

Beitrag von Bora4d »

Du verwendest in Schleife Modaldialog, ich hatte auch mal merkwürdiges verhalten bei so einem fall; es war aber kein DB. Seitdem verwende ich immer Memo um Werte für Debug-Zwecke anzuzeigen.

ZEOS ist open-source. Vorteil ist dass man mit gleichen Komponenten verschiedene DB-Systeme verwenden kann.
http://zeos.firmos.at/

Antworten