Delphi TADOQuery Select 前 N

Delphi TADOQuery Select top N

我正在尝试 select TADOQuery 中仅顶部 N 项,但是当我激活查询时它给了我错误。好像找到top参数就好了,但是执行的时候没有替换掉。如果我不使用 "Top N" 限制 SQL 语句,代码就可以正常工作。

下面是代码的基本思路。

const SQL_STR = 'SELECT TOP :cnt name from dSomeTable where done = FALSE';

var
  dbCon         : TADOConnection;
  toSolveQry    : TADOQuery;
  getCnt        : TParameter;
  names         : TField;
  threadCnt     : Integer;

begin
  threadCnt  := 3;
  dbCon := TADOConnection.Create(nil);
  ...
  dbCon.Open();

  toSolveQry := TADOQuery.Create(nil);
  toSolveQry.Connection := dbCon;
  toSolveQry.SQL.Add(SQL_STR);
  toSolveQry.ParamCheck := True;
  getCnt := toSolveQry.Parameters.ParamByName('cnt');
  getCnt.Value := threadCnt;

  toSolveQry.Active := true; //Error here

  names       := toSolveQry.FieldByName('name');
  ...
end

参数不能用于 SELECTWHERE 子句中的列名。这也排除了在 TOP x 中的使用。

改用Format函数:

const SQL_STR = 'SELECT TOP %d name from dSomeTable where done = FALSE';

toSolveQry.SQL.Text := Format(SQL_STR, [threadCnt]);
toSolveQry.Open;

使用整数格式说明符 (%d) 可防止 SQL 注入,因为 Delphi 如果您提供整数值以外的任何内容作为 [=14 的参数,则会引发异常=].