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