我试图在简单的MS Access表(tblCustomer)上允许记录更新。要编辑记录,对于SET子句,用户从组合框(cboSetField)中选择字段名称,并将文本输入到关联的文本框(txtSet)中。对于WHERE子句,用户从组合框(cboWhereField)中选择一个字段,并将文本输入到关联的文本框(txtWhere)中。所以,基本上,我在后面的代码中所拥有的内容类似于:
更新tblCustomers SET [cboSetField] = [txtSet] WHERE [cboWhereField] = [txtWhere]
这是实际的Delphi代码:
procedure TfrmDeleteCustomer.cmdUpdateClick(Sender: TObject);
var WhereFieldSelection,WhereTextSelection, SetFieldSelection, SetTextSelection :string;
begin
WhereFieldSelection:=cboWhereField.Text;
WhereTextSelection:=txtWhere.Text;
SetFieldSelection:=cboSetField.Text;
SetTextSelection:=txtSet.Text;
adoQuery1.SQL.Clear;
adoQuery1.SQL.Add('UPDATE tblCUSTOMER');
adoQuery1.SQL.Add('SET (:SetFieldSelection) = (:SetTextSelection)');
adoQuery1.SQL.Add('WHERE (:WhereFieldSelection) = (:WhereTextSelection)');
adoQuery1.Parameters.ParamByName('SetFieldSelection').Value:= SetFieldSelection;
adoQuery1.Parameters.ParamByName('SetTextSelection').Value:= SetTextSelection;
adoQuery1.Parameters.ParamByName('WhereFieldSelection').Value:= WhereFieldSelection;
adoQuery1.Parameters.ParamByName('WhereTextSelection').Value:= WhereTextSelection;
adoQuery1.ExecSQL;
adoQuery1.Close;
txtSet.Text:='';
txtWhere.Text:='';
cboSetField.Text:='';
cboWhereField.Text:='';
adoQuery1.SQL.Clear;
adoQuery1.SQL.Add('SELECT * FROM tblCUSTOMER');
adoQuery1.Open;
end;
现在,当我运行程序时,我收到以下错误消息:
引发异常类:UPDATE语句中的语法错误
我在这里做错了什么?
使用:Delphi 7,ADO连接,MS ACCESS 2003。
答案 0 :(得分:1)
通常在大多数数据库API中,例如ADO(或PHP的PDO或Python的游标),SQL查询中的参数涉及在查询中传递值,而不传递字段名称这是表格的结构组成部分。
考虑动态formatting然后使用参数化值的SQL字符串:
adoQuery1.SQL.Add(format('UPDATE tblCUSTOMER SET %S = :SetTextSelection', [SetFieldSelection]));
adoQuery1.SQL.Add(format('WHERE %S = :WhereTextSelection', [WhereFiedSelection]));
adoQuery1.Parameters.ParamByName('SetTextSelection').Value:= SetTextSelection;
adoQuery1.Parameters.ParamByName('WhereTextSelection').Value:= WhereTextSelection;
adoQuery1.ExecSQL;