2011-10-13 26 views
4

我在Delphi 7和Oracle中使用ADOQuery。在將參數傳遞給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; 

當我打開查詢我將獲得以下錯誤:

Parameter object is improperly defined. Inconsistent or incomplete information is provided.

+0

如果我刪除查詢的最後一個條件,那麼它工作正常。 ''select * from temp_table where column1 in(從table2中選擇列,其中id =:id)' – Nalu

+1

使用id1和id2而不是2「id」s – SimaWB

回答

4

我們有同樣的問題,我們結束「掩飾」類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'; 

我希望它能幫助。

0

您需要兩個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; 
+0

是不可能每個使用相同的id?實際上在我原來的查詢中,我必須傳遞7次這個'id'字段。 – Nalu

+0

@naren:是的,但有可能,但paramby ...方法只會找到第一個。這就是爲什麼其他兩個答案遍歷所有參數並更新所有名稱匹配的地方。 –

1
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; 
相關問題