1

我正在 a 中执行一个UPDATE语句,TADOQuery并且我正在为一些事情使用参数。最初,这工作得很好,但我为表名和字段名添加了另一个参数,现在它坏了。

代码如下所示:

Q.SQL.Text:= 'update :tablename set :fieldname = :newid where :fieldname = :oldid';
Q.Parameters.ParamValues['tablename']:= TableName;
Q.Parameters.ParamValues['fieldname']:= FieldName;
Q.Parameters.ParamValues['oldid']:= OldID;
Q.Parameters.ParamValues['newid']:= NewID;

我得到的错误是:

错误信息

我假设这是因为我使用了这个字段名两次。我可以通过第二次使用另一个唯一的字段名称来克服这个问题,但是我仍然有另一个错误:

错误信息

如何使用参数指定要更新的表和字段?

4

1 回答 1

5

查询参数并非旨在参数化表名。

可以做的是在 SQL 中为表名使用占位符,然后使用该Format函数将这些占位符替换为表名,然后像往常一样使用其他值的参数。这对于 SQL 注入来说仍然是相对安全的(恶意的人必须知道准确的表名、正在使用的特定 SQL 语句以及为参数提供的值)。

const
  QryText = 'update %s set :fieldname = :newid where :fieldname = :oldid';
begin
  Q.SQL.Text := Format(QryText, [TableName]);
  Q.Parameters.ParamValues['fieldname'] := FieldName;
  Q.Parameters.ParamValues['oldid'] := OldID;
  Q.Parameters.ParamValues['newid'] := NewID;    
  ...
end;
于 2013-10-23T16:23:06.653 回答