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;