首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔菲TADOQuery选择顶N

德尔菲TADOQuery选择顶N
EN

Stack Overflow用户
提问于 2015-01-29 16:55:12
回答 1查看 1K关注 0票数 2

我试图只选择N项中的TADOQuery,但是当我激活查询时,它会给我带来错误。它似乎很好地找到了顶层参数,但是在执行时却无法替换它。如果我不使用"Top N“限制SQL语句,那么代码可以正常工作。

下面是代码的基本思想。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-29 17:01:05

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

使用Format函数代替:

代码语言:javascript
复制
const SQL_STR = 'SELECT TOP %d name from dSomeTable where done = FALSE';

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

使用整数格式说明符(%d)可以防止Format注入,因为如果您只提供一个整数值作为Format的参数,则Delphi将引发异常。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28220235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档