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;

我做什么都没关系,它不会解析第二条 SQL 语句的参数,所以我不能按名称绑定“valueY”参数。

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

  1. 自己手动构建qry.Params列表。
  2. qry在两个命令之间销毁并重新创建对象。

我不应该做这两件事。也许对象上有一个属性或某些东西qry会导致它在每次将新的 SQL 语句分配给它的CommandText属性时重新解析参数?

4

2 回答 2

3

原来是语法问题。参数必须以 a :not a开头@。在真正的第一个查询中,我有本地 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;
于 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.Clear中间打电话,SQL酒店会为您处理。

于 2012-05-17T17:33:21.433 回答