Björn karpenstein - Di 13.09.05 14:01
Titel: Nochmal TADOQuery liefert Fehler bei INSERT MSDE
Hallo,
wenn ich folgendes INSERT auf die Datenbank mache:
Delphi-Quelltext
1: 2: 3: 4:
| neueKategorie := InputBox('Name der Kategorie', 'Wie soll die neue Kategorie heissen?', 'neue Kategorie'); ADOQuery1.SQL.Add('INSERT INTO kategorie([Bezeichnung], [vorgaengerid]) VALUES ("'+PChar(neueKategorie)+'", '+IntToStr(PMyRec(TreeView1.Selected.Data)^.ID)+')'); ADOQuery1.ExecSQL; |
Erhalte ich den Fehler:
Der Name 'neue Kategorie' ist in diesem Kontext nicht zulässig. Nur Konstanten, Ausdrücke und Variablen sind zulässig. Spaltennamen sind nicht zulässig.
Die Ausgabe der SQL-Anweisung sieht normal aus:
INSERT INTO kategorie([Bezeichnung], [vorgaengerid]) VALUES ("neue Kategorie", 4)
Auch wenn ich das von Hand in das TADOQuery eingeben, erhalte ich die Fehlermeldung
Woran könnte das liegen?
jaevencooler - Di 13.09.05 14:10
Titel: Re: Nochmal TADOQuery und ExecSQL liefert Fehler bei INSERT
Moin, Moin,
hmmmmm,
Björn karpenstein hat folgendes geschrieben: |
Hallo,
wenn ich folgendes INSERT auf die Datenbank mache:
Delphi-Quelltext 1: 2: 3: 4:
| neueKategorie := InputBox('Name der Kategorie', 'Wie soll die neue Kategorie heissen?', 'neue Kategorie'); ADOQuery1.SQL.Add('INSERT INTO kategorie([Bezeichnung], [vorgaengerid]) VALUES ("'+PChar(neueKategorie)+'", '+IntToStr(PMyRec(TreeView1.Selected.Data)^.ID)+')'); ADOQuery1.ExecSQL; |
Erhalte ich den Fehler:
Der Name 'neue Kategorie' ist in diesem Kontext nicht zulässig. Nur Konstanten, Ausdrücke und Variablen sind zulässig. Spaltennamen sind nicht zulässig.
Die Ausgabe der SQL-Anweisung sieht normal aus:
INSERT INTO kategorie([Bezeichnung], [vorgaengerid]) VALUES ("neue Kategorie", 4)
Auch wenn ich das von Hand in das TADOQuery eingeben, erhalte ich die Fehlermeldung
Woran könnte das liegen? |
Also, das Insert Statement sollte meines Wissens nach so aus sehen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| ADOQuery1.SQL.Add('insert into kategorie'); ADOQuery1.SQL.Add('(bezeichnung, vorgaengerid)'); ADOQuery1.SQL.Add('values (:bezeich,:vorgang)'); ADOQuery1.ParamByName('bezeich').asstring := neueKategorie; ADOQuery1.ParamByName('vorgang').asstring := IntToStr(PMyRec(TreeView1.Selected.Data)^.ID); . . . usw |
oder so ähnlich :lol:
So funktioniert es zumindestens bei mir. Ist aber natürlich abhängig von der datenbank die Du ansprichst.
Beste Grüße
Michael
Björn karpenstein - Di 13.09.05 14:20
Hallo!
Ich benutze MS SQL Server 2005 Express (MSDE). Ich hab von ADOQuery "ParamByName" nicht gefunden, sondern nur "Parameters. Leider funktioniert die "AsString"-Methode nicht. Was muss ich da machen? Muss ich die Params vielleicht erst hinzufügen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TFormular_Kategorien.Button2Click(Sender: TObject); var neueKategorie : String; begin if TreeView1.Selected <> nil then begin neueKategorie := InputBox('Name der Kategorie', 'Wie soll die neue Kategorie heissen?', 'neue Kategorie');
ADOQuery1.SQL.Add(' INSERT INTO kategorie'); ADOQuery1.SQL.Add('(Bezeichnung, vorgaengerid)'); ADOQuery1.SQL.Add(' VALUES (:bezeich,:vorgang);'); ADOQuery1.Parameters.ParamByName('bezeich').AsString := neueKategorie; ADOQuery1.Parameters.ParamByName('vorgang').AsString := PMyRec(TreeView1.Selected.Data)^.ID;
ADOQuery1.ExecSQL;
self.aktualisiereBaum; end else begin ShowMessage('Kein Knoten ausgewählt!'); end; end; |