重用TSQLQuery Missing Params

时间:2012-05-17 17:14:21

标签: delphi parsing parameters delphi-xe2

我正在使用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;

我做什么并不重要,它不解析第二个SQL语句的参数,所以我不能按名称绑定'valueY'参数。

我可以想到两个解决方法:

  1. 自己手动构建qry.Params列表。
  2. 在两个命令之间销毁并重新创建qry对象。
  3. 我不应该做这些中的任何一个。也许qry对象上有一个属性或某些东西会导致它在每次将新的SQL语句分配给其CommandText属性时重新分析参数?

2 个答案:

答案 0 :(得分:3)

原来是一个语法问题。参数必须以:而不是@开头。我在整个真正的第一个查询中都有本地SQL变量,所以整个SQL中都有@param: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;

答案 1 :(得分: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属性将为您处理。{/ p>