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

时间:2013-07-31 15:06:53

标签: asp-classic odbc adodb

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

我无法弄清楚如何使用命名变量执行此操作。我只是成功地使用"?"运算符并按SQL中定义的顺序添加参数。这在我的情况下并不好[1]。

我能用简单的一些简单的参数替换吗? operator和CreateParameter(...):

var oCmd = Server.CreateObject("ADODB.Command");
oCmd.CommandText = "SELECT * FROM sometable WHERE somefield = ? AND another = ?";
oCmd.Parameters.Append oCmd.CreateParameter("", adVarChar, adParamInput, 50, "val1")
oCmd.Parameters.Append oCmd.CreateParameter("", adVarChar, adParamInput, 50, "val2")

但如果我尝试用名字来做,那么不会工作:

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")

我看到一些说明可能实际上是ODBC失败(http://www.codeproject.com/Tips/231217/Parameters-SqlCommand-vs-OledbCommand-and-OdbcComm)。有没有人知道这个或其他选择的方法?

[1]不幸的是我不能用? ? ?并按顺序定义参数。代码已经包含在遗留的ORM中,该ORM将按顺序分配值。如果我可以通过名字发送它们,那么我可以干净利落地完成它。

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

1 个答案:

答案 0 :(得分:2)

我曾经不得不修改adodb的postgres驱动程序(2004版),使其能够在postgres语句中处理两个参数和使用正则表达式。问题是使用"?"问题字符始终被解释为参数。所以我在 _query 方法上修改了Postgres 7驱动程序,将第151行更改为:

$sqlarr = explode(' ?',trim($sql)); 

只需在问号前添加空格即可。 ' ?'由$ 1,$ 2等驱动程序替换,因此,您可能希望此替换发送此命名参数$ 1,$ 2而不是"?"。

Abrazo