语法错误。在查询表达式中-Delphi
Posted
技术标签:
【中文标题】语法错误。在查询表达式中-Delphi【英文标题】:Syntax error. in query expression -Delphi 【发布时间】:2017-08-07 08:54:23 【问题描述】:我有以下查询并遇到错误,我正在使用带有 MS Access 的 XE8
语法错误。在查询表达式'select CCarID from tblcar where Car = (LX008)'
Procedure TFNewCarAct.BtnSaveClick(Sender: TObject);
begin
adoQueryCCA.Close();
adoQueryCCA.SQL.Clear;
adoQueryCCA.SQL.Add('INSERT INTO tblcaractivity ([CCarID],[Date],[Millage],[SerRcd],[EOType],[EOQunt],[AirFil],[GOil])');
adoQueryCCA.SQL.Add('values (select CCarID from tblcar where Car = ('+ComboBox2.Text+'))');
adoQueryCCA.SQL.Add('VALUES(:Date,:Millage,:SerRcd,:EOType,:EOQunt,:AirFil,:GOil)');
adoQueryCCA.Parameters.ParamByName('Date').Value:= Edit6.Text;
adoQueryCCA.Parameters.ParamByName('Millage').Value:= Edit1.Text;
adoQueryCCA.Parameters.ParamByName('SerRcd').Value:= memo1.Text;
adoQueryCCA.Parameters.ParamByName('EOType').Value:= Edit2.Text;
adoQueryCCA.Parameters.ParamByName('EOQunt').Value:= Edit3.Text;
adoQueryCCA.Parameters.ParamByName('AirFil').Value:= Edit4.Text;
adoQueryCCA.Parameters.ParamByName('GOil').Value:= Edit5.Text;
adoQueryCCA.ExecSQL;
ShowMessage('Done');
end;
更新:
procedure TFNewCarAct.FromShow(Sender: TObject);
begin
ADOQueryCT.Open;
while Not ADOQueryCT.Eof do
begin
ComboBox1.Items.Add(ADOQueryCT.FieldByName('Name').AsString);
ADOQueryCT.Next;
end;
ADOQueryCT.Close;
if ComboBox1.Items.Count > 0 then ComboBox1.ItemIndex := 0;
end;
procedure TFNewCarAct.OnComboBox1Change(Sender: TObject);
begin
ComboBox2.Items.BeginUpdate;
try
ComboBox2.Clear;
ADOQueryCC.Parameters.ParamByName('Name').Value := ComboBox1.Text;
ADOQueryCC.Open;
while Not ADOQueryCC.Eof do
begin
ComboBox2.Items.AddObject(ADOQueryCC.FieldByName('Car').AsString, '');
ADOQueryCC.Next;
end;
ADOQueryCC.Close;
if ComboBox2.Items.Count > 0 then ComboBox2.ItemIndex := 0;
finally
ComboBox2.Items.EndUpdate;
end;
end;
comboBox2 中的 Car 从 tblecar 获取并希望将 FK 保存在 tblcaractivity 表中。
维多利亚提供的建议现在会导致“未指定错误”。
您能否帮助我修改代码以将 FK 保存在 tblcaractivity 表中。
【问题讨论】:
删除values
。正确的语法是insert into ... select ...
。顺便说一句:添加您正在使用的 db 标签。
您必须对字符串值进行转义。您可以改写查询并使用参数。或者,更好的是,将汽车 ID 存储到组合框列表数据对象中,然后简单地将其用作整数参数。
那将是正确的语句 adoQueryCCA.SQL.Add('INSERT INTO tblcaractivity ([CCarID])(select CCarID from tblcar where Car = ('+ComboBox2.Text+'))');
'VALUES ((SELECT CCarID FROM tblcar WHERE Car = ' + QuotedStr(ComboBox2.Text) + '), :Date...)'
可能会起作用。但我会亲自将 ID 存储在组合框中(如果曾经使用视觉控件作为存储)。
"你能指导我吗..." 那不是你最初问的q,不适合在评论中回复。如果您想要答案,请发布一个新的 q。
【参考方案1】:
试一试;
Procedure TFNewCarAct.BtnSaveClick(Sender: TObject);
begin
adoQueryCCA.Close();
adoQueryCCA.SQL.Clear;
adoQueryCCA.SQL.Add('INSERT INTO tblcaractivity ([CCarID],[Date],[Millage],[SerRcd],[EOType],[EOQunt],[AirFil],[GOil])');
adoQueryCCA.SQL.Add('VALUES(:CCarID,:Date,:Millage,:SerRcd,:EOType,:EOQunt,:AirFil,:GOil)');
adoQueryCCA.Parameters.ParamByName('CCarID').Value:= Integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]);
adoQueryCCA.Parameters.ParamByName('Date').Value:= Edit6.Text;
adoQueryCCA.Parameters.ParamByName('Millage').Value:= Edit1.Text;
adoQueryCCA.Parameters.ParamByName('SerRcd').Value:= memo1.Text;
adoQueryCCA.Parameters.ParamByName('EOType').Value:= Edit2.Text;
adoQueryCCA.Parameters.ParamByName('EOQunt').Value:= Edit3.Text;
adoQueryCCA.Parameters.ParamByName('AirFil').Value:= Edit4.Text;
adoQueryCCA.Parameters.ParamByName('GOil').Value:= Edit5.Text;
adoQueryCCA.ExecSQL;
ShowMessage('Done');
end;
procedure TFNewCarAct.FromShow(Sender: TObject);
begin
ADOQueryCT.Open;
while Not ADOQueryCT.Eof do
begin
ComboBox1.Items.Add(ADOQueryCT.FieldByName('Name').AsString);
ADOQueryCT.Next;
end;
ADOQueryCT.Close;
if ComboBox1.Items.Count > 0 then ComboBox1.ItemIndex := 0;
end;
procedure TFNewCarAct.OnComboBox1Change(Sender: TObject);
begin
ComboBox2.Items.BeginUpdate;
try
ComboBox2.Clear;
ADOQueryCC.Parameters.ParamByName('Name').Value := ComboBox1.Text;
ADOQueryCC.Open;
while Not ADOQueryCC.Eof do
begin
ComboBox2.Items.AddObject(ADOQueryCC.FieldByName('Car').AsString, TObject(ADOQueryCC.FieldByName('CCarID').AsInteger));
ADOQueryCC.Next;
end;
ADOQueryCC.Close;
if ComboBox2.Items.Count > 0 then ComboBox2.ItemIndex := 0;
finally
ComboBox2.Items.EndUpdate;
end;
end;
【讨论】:
以上是关于语法错误。在查询表达式中-Delphi的主要内容,如果未能解决你的问题,请参考以下文章
ASP语法错误 (操作符丢失) 在查询表达式 'PaperId=' 中。