2012-01-16 92 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中更改该参数。

相关问题