Delphi 重用TSQLQuery缺少参数

Delphi 重用TSQLQuery缺少参数,delphi,parsing,parameters,delphi-xe2,Delphi,Parsing,Parameters,Delphi Xe2,我正在使用DelphiXe2和一个TSQLQuery对象。我第一次使用它时它就起作用了。如果我立即重用它,那么它不会解析新SQL的参数并重建qry.Params列表: 不管我做什么,它都不会解析第二条SQL语句的参数,所以我不能按名称绑定'valueY'参数 我可以想出两个变通办法: 我自己手动构建qry.Params列表。 在两个命令之间销毁并重新创建qry对象。 我不应该做这两件事。也许qry对象上有一个属性或某些东西,每次将新SQL语句分配给它的CommandText属性时,都会导致它重新

我正在使用DelphiXe2和一个TSQLQuery对象。我第一次使用它时它就起作用了。如果我立即重用它,那么它不会解析新SQL的参数并重建qry.Params列表:

不管我做什么,它都不会解析第二条SQL语句的参数,所以我不能按名称绑定'valueY'参数

我可以想出两个变通办法:

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

使用TSQLQuery.SQL属性而不是TSQLQuery.CommandText属性:

qry.SQL.Text := 'select field1 from table1 where fieldX = @valueX'; 
...
qry.SQL.Text := 'select field2 from table2 where fieldY = @valueY'; 
无需调用参数。清除中间值,SQL属性将为您处理此问题。

使用TSQLQuery.SQL属性而不是TSQLQuery.CommandText属性:

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

无需调用参数。如果在这两者之间清除,SQL属性将为您处理该问题。

结果是语法问题。参数必须以:而不是@开头。我在第一个查询中使用了本地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;

结果是一个语法问题。参数必须以:而不是@开头。我在第一个查询中使用了本地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;

谢谢@Remy。我试过了,但没人知道,但没用。然而,我在最后几分钟发现了问题。我会发布答案。。。谢谢你的时间!谢谢@Remy。我试过了,但没人知道,但没用。然而,我在最后几分钟发现了问题。我会发布答案。。。谢谢你的时间!