我正在清理一些通过 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 中,它将乱序子化这些值。如果我可以按名称发送它们,那么我可以干净地做到这一点。
任何帮助或指示将不胜感激。