2

我试图只选择 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
4

1 回答 1

4

参数不能用于SELECTorWHERE子句中的列名。这也排除了使用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 将引发异常Format

于 2015-01-29T17:01:05.060 回答