Asp classic 如何在Postgres和ADODB中使用命名参数/命名准备语句

Asp classic 如何在Postgres和ADODB中使用命名参数/命名准备语句,asp-classic,odbc,adodb,Asp Classic,Odbc,Adodb,我正在清理一些遗留的asp vba代码,这些代码通过ADODB与Postgres数据库(8.2)通信。目前,它正在为SQL语句使用字符串构建,显然我希望使用准备好的语句来避免SQL注入 我无法解决如何使用命名变量执行此操作。我只成功地使用了“?”操作符,并按照SQL中定义的顺序添加了参数。在我的情况下,这是不好的 我已经能够使用?运算符和CreateParameter(…): 但如果我试图用名字来做,那么它就不起作用了: 我看到一些注释说这实际上可能是ODBC()的失败。有没有人知道如何解决这个

我正在清理一些遗留的asp vba代码,这些代码通过ADODB与Postgres数据库(8.2)通信。目前,它正在为SQL语句使用字符串构建,显然我希望使用准备好的语句来避免SQL注入

我无法解决如何使用命名变量执行此操作。我只成功地使用了“?”操作符,并按照SQL中定义的顺序添加了参数。在我的情况下,这是不好的

我已经能够使用?运算符和CreateParameter(…):

但如果我试图用名字来做,那么它就不起作用了:

我看到一些注释说这实际上可能是ODBC()的失败。有没有人知道如何解决这个问题或其他选择

[1] 不幸的是我不能使用?并按顺序定义参数。代码已经封装在一个遗留ORM中,该ORM将无序地将这些值分为子值。如果我能把他们的名字发给他们,那么我就能干净利落地做到这一点


任何帮助或指示都将不胜感激。

我曾经不得不修改adodb(2004版)的postgres驱动程序,使其能够处理参数并在postgres语句中使用正则表达式。问题是使用“?”问题字符总是被解释为参数。因此,我在\u query方法中修改了Postgres 7驱动程序,将第151行更改为:

$sqlarr = explode(' ?',trim($sql)); 
在问号前加一个空格。“?”被驱动程序替换为$1、$2等,因此,您可能预期此替换将发送此命名参数$1、$2,而不是“?”


阿布拉佐

我仍在寻找一种“合适”的方法来做到这一点。然而,在我自己的例子中,我的解决方法是:在执行SQL之前,通过SQL字符串解析查找@replacement标记,然后替换a?,并创建一个参数。通过这种方式,参数是按顺序创建的。但它是黑的。我还不得不猜测什么时候应该替换数值。这可能是驱动因素的问题。我的建议是检查您使用的驱动程序,查看选项,并联系驱动程序开发人员。不幸的是,你可能会从这种方法中获得比这里多得多的里程数。谢谢阿布拉佐。不幸的是,我目前无法访问该系统(它仍在运行),因此无法验证这是否可行。但这听起来很有希望。
var oCmd = Server.CreateObject("ADODB.Command");
oCmd.CommandText = "SELECT * FROM sometable WHERE somefield = @a AND another = @b";
oCmd.Parameters.Append oCmd.CreateParameter("@b", adVarChar, adParamInput, 50, "val2")
oCmd.Parameters.Append oCmd.CreateParameter("@a", adVarChar, adParamInput, 50, "val1")
$sqlarr = explode(' ?',trim($sql));