Entwickler-Ecke

Datenbanken - Nochmal TADOQuery liefert Fehler bei INSERT MSDE


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)+')');
//    ShowMessage(ADOQuery1.SQL[0]);
    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,

user profile iconBjö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)+')');
//    ShowMessage(ADOQuery1.SQL[0]);
    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;


Björn karpenstein - Di 13.09.05 14:27

Okay hab mich ein bissel dumm angestellt viele dank!

So gehts:


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.ParamValues['bezeich'] := neueKategorie;
    ADOQuery1.Parameters.ParamValues['vorgang']  := PMyRec(TreeView1.Selected.Data)^.ID;

    ADOQuery1.ExecSQL;

    self.aktualisiereBaum;
  end else
  begin
    ShowMessage('Kein Knoten ausgewählt!');
  end;
end;