【问题标题】:Prevent TParams duplication防止 TParams 重复
【发布时间】:2021-12-07 12:17:22
【问题描述】:

我有一个 TParams 实例 (FParams),当我调用 ParseSQL() 时,如果给定的 SQL 包含对同一参数名称的多个引用,它会重复参数。

例如:

FParams.ParseSQL(
  'select * from user_relations where user1 = :p_logged_user or user2 = :p_logged_user', 
  True);

它会生成两个具有相同名称的 TParams 项目,这会在我的代码后面引起问题。我知道 DB 访问组件 (TUniQuery) 消除了这个问题,并且在解析其 SQL 文本时不会重复参数,但我无法找到相关代码,如何轻松做到这一点。

是否有任何内置方法可以防止 TParams 存储/解析重复的参数?

我已经在 ParseSQL() 之后编写了代码来立即删除它们,我只是想知道我是否错过了一些“开箱即用”的解决方案。

更新了示例代码,以明确我为什么要为两个参数使用相同的名称。我的意见是同名让代码更直接。

【问题讨论】:

  • 最简单的选择是对参数进行不同的命名,例如。 :P1:P2 并为两个参数提供相同的值。
  • 谢谢,但我不希望这样,可能会让其他开发人员感到困惑,甚至一段时间后自己也会感到困惑:)
  • 我在下面为您提供另一种选择作为答案。

标签: delphi


【解决方案1】:

如果您使用的是 SQL Server,您可以将您的 SQL 替换为:

Declare @P1 varchar(10)
set @P1 = :p_loggeduser
select * from user_relations where user1 = @P1 or user2 = @P1

我不知道还有哪些其他数据库平台会支持这种语法。

【讨论】:

  • 感谢您的努力,但看起来我没有正确表达我的问题,所以我更新了它。顺便说一句,我正在使用 oracle :)
【解决方案2】:

对于某些数据库,实际发送的内容使用? 参数。对于某些数据访问组件,参数列表是有序的,并且与此版本查询中的? 参数具有相同数量的条目。

select * from user_relations where user1 = ? or user2 = ?

Delphi 将 SQL 中的命名参数支持扩展到所有数据库,并在幕后完成额外的工作。其中之一是参数列表可能比预期的要大,具体取决于所使用的数据访问组件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2011-04-23
    • 2010-09-12
    • 1970-01-01
    • 2016-03-20
    • 2020-08-12
    • 2016-09-28
    • 2015-02-01
    相关资源
    最近更新 更多