如果我调用ParamByName来获取一个不存在的参数,会发生什么?

9

我很新手Delphi,收到了以下代码片段(省略了一些不相关的部分),现在我正在尝试理解它的作用:

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,将其设置在组件中容易出现许多未来的错误。 - user497849
@DorinDuminica 这不是我的代码,而是我需要审查以了解它的功能。谢谢你提供的信息,这可能在未来会有帮助! - Maza89
1
@DorinDuminica:到目前为止我还没有注意到这些错误!然而,我意识到将来可能还会遇到它们。考虑到这一点,听到你所说的“许多”可能错误中的一些甚至是非常有趣的。 - Andriy M
1
@AndriyM 嗯,当你试图用其他组件(UniDAC、AnyDAC等)替换组件时,情况会变得一团糟。此外,复制粘贴是一种非常常见的做法,因此你将复制带有其设置的查询并尝试将其用于其他目的,因此当你更改 SQL 时,由于 IDE 中的错误,可能会发生不好的事情。我主要是在谈论 D2010,由于 IDE 的错误和异常,我不得不每天杀死并重新启动它两次左右。虽然我的问题可能不是那么普遍,但是动态设置 SQL 和参数仍然是一个好习惯(在我看来),可以避免许多头疼的问题。 - user497849
@DorinDuminica:你提到的问题情况,似乎更凸显了我相对不够经验。到目前为止,我还没有处理过替换数据组件的工作。此外,由于我现在主要处理的是早期版本的Delphi编写的项目,因此至少就其错误集而言,后者仍然是一个未知领域。你看,我很快乐,因为我还有很多东西要发现!:)非常感谢你的分享! - Andriy M
@AndriyM 嗯,这种情况发生在我身上,但并不意味着一定会发生在你身上。我们从D7切换到D2010是在我的坚持下进行的,所以我不知道这些版本之间存在什么错误,使用D7时,IDE会突然崩溃,你的代码也会消失,而使用D2010时,很多时候IDE会损坏我的组件和其他东西,因此为了克服任何未来可能出现的问题,我已经训练自己写更多的代码而不是放置组件,并且不将业务逻辑与UI绑定<-这很难移植和/或升级。无论如何,希望能有所帮助。 - user497849
3个回答

8
这意味着SQL语句可能会在运行时更改。因此,当使用该查询时,SQL已包含AND part = :part
如果SQL语句不包含这个额外参数part,则在赋值ParamByName('part').Value := 1时会引发异常。
我假设您没有混淆SelectCosts的引用(它在DM_HRV中而不是其他DM)。

1
或者,虽然不太可能,查询可能会在完全不同的地方更改,你永远无法知道。 - Andriy M
@kobik 谢谢,正是我已经想到的。@AndriyM 尽管你认为这种可能性较小,但我发现它确实在一个完全不同的地方被更改了。查询文本被替换为 SELECT * FROM costs WHERE code = :code AND part = :part AND year = :year' - Maza89

5
您的帖子中以下语句并未添加参数,而是设置了其值:
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中更改它们。


0

添加新参数不会改变查询。您需要自己进行更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接