Delphi 如何将参数传递给ADOQuery对象?

Delphi 如何将参数传递给ADOQuery对象?,delphi,tadoquery,Delphi,Tadoquery,我在Delphi7和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'; ADOQue

我在Delphi7和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;
打开查询时,将出现以下错误:

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


您需要区分这两个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;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;

我们也有同样的问题,我们结束了对类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';

我希望这能有所帮助。

我们也遇到了同样的问题,我们最终屏蔽了类t参数,如下所示:

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;
声明:

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';

我希望它能有所帮助。

如果我删除了查询的最后一个条件,那么它就可以正常工作。select*from temp_table where column1 in select column from table2 where id=:id'使用id1和id2而不是id2如果我删除了查询的最后一个条件,那么它可以正常工作。select*from temp_table where column1 in select column from table2 where id=:id'使用id1和id2代替id2不可能使用相同的id?实际上,在我最初的查询中,这个“id”字段必须经过7次。@naren:是的,这是可能的,但是参数。。。方法将只找到第一个。这就是为什么其他两个答案在所有参数上循环,并在名称匹配的地方更新所有参数。不可能每个都使用相同的id吗?实际上,在我最初的查询中,这个“id”字段必须经过7次。@naren:是的,这是可能的,但是参数。。。方法将只找到第一个。这就是为什么其他两个答案在所有参数上循环,并在名称匹配的地方更新所有参数。
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;