绑定变量选项

Posted

技术标签:

【中文标题】绑定变量选项【英文标题】:Bind variable options 【发布时间】:2012-02-21 16:05:44 【问题描述】:

是否可以在 SQL Server 中使用与 Oracle 相同的表示法来表示绑定变量,即:0、:1 而不是使用?。

我已经搜索过,但没有找到任何关于此的结论。目前,我的解决方案使用绑定变量将值引入我在数据库上运行的语句中,这在 Oracle 中运行良好,但我还需要在 SQL Server 和 PostGIS 中执行相同的操作,仅举几例。例如,我不想说:

switch(dialect)

    case "Oracle":
    
        oleDataBaseConnection.AddParameter(":1", coordsys);
        break;
    

    case "SQLServer":
     
        oleDataBaseConnection.AddParameter("?", coordsys);
        break;
    

*AddParameter() 是我的包装类中的一个函数,它在调用我编写的执行函数时将值添加到要添加到命令对象的列表中。

我希望我的代码尽可能干净,并且不包含如上所示的硬编码内容。我想要一个适合所有人的解决方案。 (是的,我知道这可能是一厢情愿!)

我知道我可以使用字符串替换来做到这一点,但这不是我所追求的。我真的不想使用这样的解决方法。我的项目经理还要求我尝试使用绑定变量找到解决方案。

有什么想法吗?

【问题讨论】:

【参考方案1】:

简短的回答是否定的,绑定变量在不同数据库中的实现方式不同。所以你需要在某个地方使用混乱的兼容性逻辑。

也就是说,我个人过去曾使用字符串替换为绑定参数输入正确的语法来解决此问题。因此,您可以在 SQL 语句中嵌入 :coordsys,然后在代码中嵌入 oleDataBaseConnection.AddParameter("coordsys", coordsys);。然后,您的准备语句将搜索 SQL,找到 :coordsys 并将其替换为您需要的任何内容(例如 ?),并按名称构建参数列表以供以后执行。当你去执行时,你可以动态建立正确的绑定参数列表来使用。

实现幕后操作有点棘手,但我个人发现它可以带来干净的 SQL,并具有绑定参数的好处(如数据库性能、SQL 注入攻击的安全性)。

【讨论】:

我想我明白你的意思了。所以基本上当我将参数添加到命令时,我的包装类将处理字符替换。所以我会像现在一样简单地检测所需的方言,并输入正确的语法是 ?或:。一个问题是我的一个数据库可能根本不支持绑定变量。我想在这种情况下,我必须在我的代码中进行字符串替换,但我必须事先知道它不支持绑定变量。这确实是一项相当棘手的任务。 @CSharpened 完全正确。然而,在这一点上,我希望所有体面的数据库驱动程序都以某种方式支持绑定变量,因为这对于避免 SQL 注入攻击非常重要。 好的,谢谢您的信息。我会看看我是否可以成功实施您的建议。这似乎是我需要和想到的,但我希望可能有一个更优雅的解决方案。谢谢。

以上是关于绑定变量选项的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序-数据变量及事件绑定初探

微信小程序-数据变量及事件绑定初探

微信小程序-数据变量及事件绑定初探

在shell脚本中获取未绑定的变量错误

mybatis最大绑定多少个变量

如何为 SqlDataSource 动态绑定变量参数