我正在使用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'参数。
我可以想到两个解决方法:
qry.Params
列表。qry
对象。我不应该做这些中的任何一个。也许qry
对象上有一个属性或某些东西会导致它在每次将新的SQL语句分配给其CommandText
属性时重新分析参数?
答案 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.Clear
,SQL
属性将为您处理。{/ p>