2

Delphi XE2 と TSQLQuery オブジェクトを使用しています。私がそれを使うのは初めてです。すぐに再利用すると、新しい SQL のパラメーターが解析されず、qry.Paramsリストが再構築されません。

var
  qry: TSQLQuery;
begin
  qry := TSQLQuery.Create(nil);
  try
    qry.MaxBlobSize := -1;
    qry.SQLConnectin := AnExistingConnection;

    qry.CommandText := 'select field1 from table1 where fieldX = @valueX';
    qry.ParamByName('valueX').Value := 1;
    qry.Open;

    // ... use data ...

    qry.Close;
    qry.Params.Clear; // <- works the same with or without this
    qry.CommandText := 'select field2 from table2 where fieldY = @valueY';
    qry.ParamByName('valueY').Value := 2; // <- Error: 'valueY' Param not found
    qry.Open;
  finally
    FreeAndNil(qry);
  end;
end;

私が何をしても問題ありません.2番目のSQLステートメントのパラメーターを解析しないため、「valueY」パラメーターを名前でバインドできません。

2 つの回避策が考えられます。

  1. qry.Params自分で手動でリストを作成します。
  2. qry2 つのコマンドの間にオブジェクトを破棄して再作成します。

私はこれらのいずれかを行う必要はありません。qryオブジェクトに、新しい SQL ステートメントがそのプロパティに割り当てられるたびにパラメータを再解析するプロパティまたは何かがあるのではないでしょCommandTextうか?

4

2 に答える 2

3

構文の問題であることが判明しました。:パラメータの前にnot aを付ける必要があります@@param実際の最初のクエリ全体でローカル SQL 変数を使用していたため、SQL 全体で変数と変数が混在:paramしていました。:paramすべてのバインドされたパラメーターの構文を使用することにより、TSQLQuery 、想定どおりにパラメーターを毎回適切に解析します。

var
  qry: TSQLQuery;
begin
  qry := TSQLQuery.Create(nil);
  try
    qry.MaxBlobSize := -1;
    qry.SQLConnectin := AnExistingConnection;

    qry.CommandText := 'select field1 from table1 where fieldX = :valueX';
    qry.ParamByName('valueX').Value := 1;
    qry.Open;

    // ... use data ...

    qry.Close;
    qry.CommandText := 'select field2 from table2 where fieldY = :valueY';
    qry.ParamByName('valueY').Value := 2;
    qry.Open;
  finally
    FreeAndNil(qry);
  end;
end;
于 2012-05-17T17:44:50.107 に答える
1

TSQLQuery.SQLプロパティの代わりにプロパティを使用しTSQLQuery.CommandTextます。

qry.SQL.Text := 'select field1 from table1 where fieldX = @valueX'; 
...
qry.SQL.Text := 'select field2 from table2 where fieldY = @valueY'; 

途中で電話する必要はありませんParams.ClearSQL宿泊施設が対応します。

于 2012-05-17T17:33:21.433 に答える