2012-01-16 150 views
8

我很新的德爾福並取得了以下一段代碼(遺漏了一些無關痛癢的部分),爲此我想了解它做什麼:如果我爲不存在的參數調用ParamByName,會發生什麼情況?

object SelectCosts: TIBQuery 
    SQL.Strings = (
     'SELECT * FROM costs ' 
     'WHERE code = :code') 
    ParamData = < 
     item 
     DataType = ftUnknown 
     Name = 'code' 
     ParamType = ptUnknown 
     end> 
    end 

在另一個文件中,該查詢使用,但添加了查詢中未定義的參數。

DM_HRV.SelectCosts.ParamByName('part').Value := 1; 

此參數'part'是否改變了所做的選擇?換句話說:SQL查詢是否自動更改爲以下內容?

'SELECT * FROM costs ' 
    'WHERE code = :code' 
    'AND part = :part' 
+2

我強烈建議動態設置SQL,在組件中設置它很容易出現很多將來的錯誤。 – ComputerSaysNo 2012-01-16 13:27:29

+0

@DorinDuminica它不是我自己的代碼,但我需要查看代碼來檢查它的功能。感謝您的信息,但未來可能會有所幫助! – Maza89 2012-01-16 13:45:49

+1

@DorinDuminica:到目前爲止還沒有注意到!但是,我意識到我可能仍然會在未來遇到他們。鑑於此,甚至可以聽到您所談論的「許多」可能的錯誤中的一些會非常有趣。 – 2012-01-16 20:23:02

回答

8

這意味着SQL語句可能會在運行時更改。所以當使用該查詢時,SQL已經包含AND part = :part

如果SQL語句不包含此額外參數part,則在分配ParamByName('part').Value := 1時將引發異常。

我假設你沒有混淆SelectCosts參考(它在DM_HRV而不是其他DM)。

+1

或者,儘管不太可能,查詢可能會在完全不同的地方進行更改,但您永遠不會知道。 – 2012-01-16 12:53:57

+0

@kobik謝謝,正是我以前的想法。雖然它看起來不太可能,但我發現它確實在一個完全不同的地方發生了變化。查詢文本被替換爲'SELECT * FROM costs WHERE code =:code AND part =:part AND year =:year'' – Maza89 2012-01-16 13:49:33

+0

@ Maza89:幹得出色! – 2012-01-16 14:31:58

0

添加新參數不會改變查詢。你必須自己做。

4

在您的文章下面的語句不加參數,它會將其值:

DM_HRV.SelectCosts.ParamByName('part').Value := 1; 

要在運行時添加參數,使用CreateParam如下:

if DM_HRV.SelectCosts.Params.FindParam('Part') = nil then 
    DM_HRV.SelectCosts.Params.createParam(ftString, 'Part', ptInput); 

查詢沒有按不會自動修改,你必須自己做。

在您的第一個剪輯中,ParamType和InputType未定義,您可以通過訪問參數列表(Params)屬性編輯器並更新這些值來在IDE中更改該參數。

相關問題