gpt4 book ai didi

delphi - 重用 TSQLQuery 缺少的参数

转载 作者:行者123 更新时间:2023-12-02 06:19:28 26 4
gpt4 key购买 nike

我正在使用 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 语句的参数,因此我无法按名称绑定(bind)“valueY”参数。

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

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

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

最佳答案

原来是语法问题。参数必须以 : 开头,而不是 @。在真正的第一个查询中,我有本地 SQL 变量,因此整个 SQL 中混合了 @param:param 变量。通过对所有绑定(bind)参数使用 :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;

关于delphi - 重用 TSQLQuery 缺少的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com