AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TDBXError: Reader-hat-keine-weiteren-Zeilen
Thema durchsuchen
Ansicht
Themen-Optionen

TDBXError: Reader-hat-keine-weiteren-Zeilen

Ein Thema von Delbor · begonnen am 5. Jan 2013 · letzter Beitrag vom 5. Jan 2013
 
Benutzerbild von sx2008
sx2008

Registriert seit: 15. 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, 13: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 13:28 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz