使用SET和WHERE为ACCESS表更新记录

时间:2015-10-16 21:42:00

标签: ms-access delphi-7

我试图在简单的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。

1 个答案:

答案 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;