Einzelnen Beitrag anzeigen

EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
414 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

ID nicht gefunden nach last_insert_rowid()

  Alt 13. Mai 2017, 16:52
Datenbank: SQLite-3 • Version: 3 • Zugriff über: dbExpress/zeos
Ich habe eine kleine Adressverwaltung einmal mit den Zeos-Komponenten und das gleiche mit den dbExpress-Komp. geschrieben (natürlich unterscheiden sich beide hinsichtlich des Zugriffs auf die Datenbank).
Beide Programme funktionieren soweit exakt.
Nach Aufruf des Abschnitts:
Delphi-Quellcode:
qMain.SQL.Text:='SELECT LAST_INSERT_ROWID() AS ID FROM KONTAKTE';
      qMain.Open;
      currentID:=qMain.FieldByName('ID').AsString;
läuft das Programm mit den Zeos-Komp. exakt durch und gibt auch die richtige ID aus.
Jedoch mit dbExpress-Komp wirft er an dieser Stelle eine Exception: qmain: Das Feld 'ID' wurde nicht gefunden.
Dies tritt jeweils bei der Eingabe eines neuen Datensatzes auf. In beiden Varianten wird jedoch der neue Datensatz gespeichert und erscheint nach Neustart des Programms exakt mit der entspr. fortlaufenden ID.
Muss man also bei Verwendung von dbExpress-Komp. anders verfahren? Ich habe einfach kühn die störende Zeile auskommentiert und er meckert nicht mehr. Ist das jedoch richtig?
Ich bin eher ein Anfänger in Bezug auf Datenbanken.
Den Fehler mit dem Debugger einzugrenzen gelang mir bislang nicht, denn an der entsprechenden Stelle gibt er mir auch nur die Fehlermeldung aus, die ich ohne Debugger im Programm lesen kann.
Kann ich mit dem Weglassen der Zeile im Programm mit dbExpreess-Komp. leben oder was sollte ich tun?
Hier die ganze Procedure uebernehmen:
Delphi-Quellcode:
procedure TMainFRM.btnuebernehmenClick(Sender: TObject);
var
  currentID: string;
begin
  qMain.SQL.Clear;
  qMain.Params.Clear;
  if flag then
  begin
    currentID:=lv.Selected.Caption;
    qMain.SQL.Text:='UPDATE KONTAKTE SET NAME= :NAM, VORNAME= :VNA, GEB= :GEB, STRASSE= :STR, Nr= :NR, PLZ= :PLZ, ORT= :ORT, TEL= :TEL, EMAIL= :EMA, BEMERKUNG= :BEM WHERE ID=:CID';
    qMain.ParamByName('CID').AsString:=currentID;
    qMain.ParamByName('NAM').AsString:=edtName.Text;
    qMain.ParamByName('VNA').AsString:=edtVorname.Text;
    qMain.ParamByName('GEB').AsString:=edtGeb.Text;
    qMain.ParamByName('STR').AsString:=edtStrasse.Text;
    qMain.ParamByName('Nr').AsString:=edtNr.Text;
    qMain.ParamByName('PLZ').AsString:=edtPLZ.Text;
    qMain.ParamByName('ORT').AsString:=edtOrt.Text;
    qMain.ParamByName('TEL').AsString:=edtTel.Text;
    qMain.ParamByName('EMA').AsString:=edtemail.text;
    qMain.ParamByName('BEM').AsString:=edtBemerkung.Text;
    qMain.ExecSQL;
    lv.Items.Clear;
    refreshItems(currentID,edtName.Text,edtVorname.Text,edtGeb.Text,edtStrasse.Text,edtNr.Text,edtPLZ.Text,edtOrt.Text,edtTel.Text,edtemail.Text,edtBemerkung.Text);
  end
  else
  begin
      qMain.SQL.Text:='INSERT INTO KONTAKTE(NAME,VORNAME,GEB,STRASSE,NR,PLZ,ORT,TEL,EMAIL,BEMERKUNG)'+'values(:NAM,:VNA,:GEB,:STR,:NR,:PLZ,:ORT,:TEL,:EMA,:BEM)';
      qMain.ParamByName('NAM').AsString:=edtName.Text;
      qMain.ParamByName('VNA').AsString:=edtVorname.Text;
      qMain.ParamByName('GEB').AsString:=edtGeb.Text;
      qMain.ParamByName('STR').AsString:=edtStrasse.Text;
      qMain.ParamByName('Nr').AsString:=edtNr.Text;
      qMain.ParamByName('PLZ').AsString:=edtPLZ.Text;
      qMain.ParamByName('ORT').AsString:=edtOrt.Text;
      qMain.ParamByName('TEL').AsString:=edtTel.Text;
      qMain.ParamByName('EMA').AsString:=edtemail.text;
      qMain.ParamByName('BEM').AsString:=edtBemerkung.Text;
      qMain.ExecSQL;
      qMain.SQL.Clear;
      qMain.Params.Clear;
      qMain.SQL.Text:='SELECT LAST_INSERT_ROWID() AS ID FROM KONTAKTE';
      qMain.Open;
      currentID:=qMain.FieldByName('ID').AsString;
      qMain.Close;
      refreshItems(currentID,edtName.text,edtVorname.Text,edtGeb.Text,edtStrasse.Text,edtNr.Text,edtPLZ.Text,edtOrt.Text,edtTel.Text,edtemail.Text,edtBemerkung.Text);
  end;
    flag :=False;
    btnuebernehmen.Enabled:=False;
    btnabbrechen.Enabled:=False;
    lv.SetFocus;
end;
Norbert
  Mit Zitat antworten Zitat