【问题标题】:UPDATE record using SET and WHERE for ACCESS table使用 SET 和 WHERE 对 ACCESS 表更新记录
【发布时间】:2015-10-16 21:41:59
【问题描述】:

我正在尝试允许对简单的 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。

【问题讨论】:

  • SQL 查询的整个输出是什么样的? UPDATE、SET 或 WHERE 之间是否有任何空格被排除,或者在任何输入的字段或条件中有什么奇怪的地方?
  • 您可能必须提供实际的字段名称,而不是 :SetFieldSelection 和 :WhereFieldSelection。我不认为字段名称可以参数化。只有值可以。将 :SetFieldSelection 和 :WhereFieldSelection 替换为实际的字段名称,删除它们的相应参数,看看它是如何工作的。
  • Yes zedfoxus,当我删除参数化的字段名称,并直接输入一个实际的字段名称时,它可以工作。那么,我现在的问题是,如何设计我的表单以适应所有可能的字段更新?组合框允许用户选择一个字段并在其旁边输入一个值。一个想法,我想每个字段都有一个文本框!?
  • 您可以保留组合框,并在代码中使用 case 语句或一系列 if/else 语句来确保在 SQL 查询中使用组合框中选择的字段。

标签: ms-access delphi-7


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    相关资源
    最近更新 更多