【问题标题】:Delphi TADOQuery Select top NDelphi TADOQuery 选择前 N 个
【发布时间】:2015-01-29 16:55:12
【问题描述】:

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

【问题讨论】:

    标签: delphi tadoquery


    【解决方案1】:

    参数不能用于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 注入,因为如果您向 Format 提供除整数值以外的任何内容,Delphi 将引发异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2013-01-25
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多