Delphi 如何将参数传递给ADOQuery对象?
我在Delphi7和Oracle中使用ADOQuery。向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
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;