Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: TDBXError: Reader-hat-keine-weiteren-Zeilen

  Alt 5. Jan 2013, 14:24
Ich sehe da mehrere Probleme in deinem Code.

1.) du hast ein Datenmodul (DelborDataMod) und darauf ein Dataset (SQLDataSetXE).
Es macht wenig Sinn stets das gleiche Dataset für unterschiedliche SQL-Anweisungen zu benützen.
Stattdessen sollte man mehrere Datasets benützen und möglichst alle Eigenschaften (insbesondere CommandText) im Objektinspektor einstellen.
Kurz: für jeden Zweck ein eigenes Dataset

2.) du verwendest ExecSQL und Close hintereinander.
Entweder eine SQL-Anweisung gibt ein Dataset zurück (kann eigentlich nur ein SELECT sein)
oder eben nicht (z.B. INSERT, UPDATE oder DELETE).
Wenn man ein Dataset erwartet verwendet man Open und Close.
Falls man kein Dataset erwartet verwendet man ExecSQL.
Diese beiden Fälle sollen nicht vermischt werden

3.) bestimme Abfragen wie z.B. Select MAX(idBild) from Bildtabelle können grundsätzlich nur einen Datensatz liefern.
Daher sollte der Code so aussehen:

Delphi-Quellcode:
procedure TPicAdmin.SelectLastId(SQLString: string);
var
  s : string;
begin
  (* im Objektinspektor festgelegt, braucht daher nicht im Code zu sein
  soll hier nur dem Verständnis dienen

  SQLString := 'Select MAX(idBild) as MaxID from Bildtabelle';
  DelborDataMod.SQLDataSetMaxId.CommandType := (ctQuery);
  DelborDataMod.SQLDataSetMaxId.CommandText := SQLString;
  *)


  DelborDataMod.SQLDataSetMaxId.Close; // zur Sicherheit erst mal schliesen
  DelborDataMod.SQLDataSetMaxId.Open;
  s := IntToStr(DelborDataMod.SQLDataSetMaxId.Fields[0].AsInteger);
  DelborDataMod.SQLDataSetMaxId.Close;

  // nur hinzufügen, falls noch nicht in der Liste
  // andernsfalls könnte die gleiche ID mehrfach eingefügt werden
  if LbxLastID.Items.IndexOf(s) <> -1 then
    LbxLastID.Items.Add(s);
end;
4.) achte darauf, dass Felder immer einen definierten Namen bekommen.
Bei der Abfrage Select MAX(idBild) from Bildtabelle hängt es von der Datenbank ab, welchen Namen das Feld bekommt.
Daher sollte man den Namen mit der AS-Klausel vorgeben:
Select MAX(idBild) AS LastId from Bildtabelle

Geändert von sx2008 ( 5. Jan 2013 um 14:28 Uhr)
  Mit Zitat antworten Zitat