【发布时间】: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 查询中使用组合框中选择的字段。