我试图只选择N项中的TADOQuery,但是当我激活查询时,它会给我带来错误。它似乎很好地找到了顶层参数,但是在执行时却无法替换它。如果我不使用"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发布于 2015-01-29 17:01:05
参数不能用于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)可以防止Format注入,因为如果您只提供一个整数值作为Format的参数,则Delphi将引发异常。
https://stackoverflow.com/questions/28220235
复制相似问题