2

TADOQuery で上位N項目のみを選択しようとしていますが、クエリをアクティブにするとエラーが発生します。トップパラメータは問題ないように見えますが、実行時にそれを置き換えることができません。「上位 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 に答える