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
参数不能用于 SELECT
或 WHERE
子句中的列名。这也排除了在 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 的参数,则会引发异常=].
我正在尝试 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
参数不能用于 SELECT
或 WHERE
子句中的列名。这也排除了在 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 的参数,则会引发异常=].