【问题标题】:How to pass parameters to an ADOQuery object?如何将参数传递给 ADOQuery 对象?
【发布时间】:2011-10-13 12:46:18
【问题描述】:

我在 Delphi 7 和 Oracle 中使用 ADOQuery。将参数传递给 ADOQuery 时出现错误。我使用了以下行。请帮我找出错误。

ADOQuery.Sql.text:= 'select * from temp_table '+
        'where column1 in (select column from table2 where id=:id) and id=:id';
ADOQuery.Parameters.ParamByValue('id').value= 'abc';
ADOQuery.open;

当我打开查询时,我会收到以下错误:

参数对象定义不正确。提供的信息不一致或不完整。

【问题讨论】:

  • 如果我删除查询的最后一个条件,那么它工作正常。 ''select * from temp_table where column1 in (select column from table2 where id=:id)'
  • 使用 id1 和 id2 而不是 2 "id"s

标签: delphi tadoquery


【解决方案1】:

我们有同样的问题,我们结束了“屏蔽”类 TParameters 像这样:

声明:

TMyParameter = class(TParameter)
private
  function GetAsValue: variant;
  Procedure SetAsValue(const Value: variant);
public
  property Value: variant read GetAsValue write SetAsValue;
end;

实施:

procedure TMyParameter.SetAsValue(const Value: variant);
var
  iPar: Integer;

begin
  for iPar:= 0 to Collection.Count - 1 do
    if (Name = TParameter(Collection.Items[iPar]).Name) then
      TParameter(Collection.Items[iPar]).Value:= Value;
end;

function TMyParameter.GetAsValue: variant;
begin
  Result:= inherited Value;
end;

以及如何使用:

TMyParameter(ADOQuery.Parameters.ParamByName('id')).AsValue:= 'abc';

希望对你有帮助。

【讨论】:

    【解决方案2】:
    for i:=0 to ADOQuery.Parameters.Count-1 do
    begin
      if ADOQuery.Parameters.Items[i].Name = 'id' then
        ADOQuery.Parameters.Items[i].Value := 'abc';
    end;
    

    【讨论】:

      【解决方案3】:

      你需要区分这两个id;s:

      ADOQuery.Sql.text:= 'select * from temp_table a where column1 in (select column from table2 b where b.id=:id) and a.id=:id'; 
      ADOQuery.Parameters.ParamByValue('id').value= 'abc'; 
      ADOQuery.open;
      

      【讨论】:

      • 不可能每个人都使用相同的ID吗?实际上,在我原来的查询中,我必须通过 7 次这个“id”字段。
      • @naren:是的,这是可能的,但 paramby... 方法只会找到第一个。这就是为什么其他两个答案会遍历所有参数并更新名称匹配的所有位置。
      【解决方案4】:

      在 SQL 代码中声明必要类型的变量,为该变量分配参数;您将能够根据需要多次使用该变量:

      ADOQuery.Sql.text:= 'declare @param varchar(50); set @param = :id; '+
      'select * from temp_table '+
      'where column1 in (select column from table2 where id=@param) and id=@param';
      
      ADOQuery.Parameters.ParamByValue('id').value= 'abc';
      ADOQuery.open;
      

      问候

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-09
        • 2010-10-16
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多