【发布时间】:2013-07-31 15:06:53
【问题描述】:
我正在清理一些通过 ADODB 与 Postgres 数据库 (8.2) 对话的遗留 asp-vba 代码。目前它正在为 SQL 语句使用字符串构建,显然我想使用准备好的语句来避免 SQL 注入。
我无法弄清楚如何使用命名变量来执行此操作。我只用“?”成功地做到了。运算符并按照它们在 SQL 中定义的顺序添加参数。这对我的情况不好[1]。
我已经能够使用 ?运算符和 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 将无序地子化这些值。如果我可以按名称发送它们,那么我可以干净地做到这一点。
任何帮助或指点将不胜感激。
【问题讨论】:
-
我仍在寻找一种“正确”的方法来做到这一点。然而,在我自己的情况下,我的解决方法是:就在执行 SQL 之前,解析 SQL 字符串,找到 @replacement 标记,然后替换一个?,并创建一个参数。这样,参数就按顺序创建了。但它很老套。而且我还必须猜测何时应该替换数值。
-
可能是驱动问题。我的建议是检查您正在使用的驱动程序,查看选项并联系驱动程序开发人员。不幸的是,您可能会从这种方法中获得比这里更多的里程。
标签: asp-classic odbc adodb