【问题标题】:ADODB Command failing Execute with parameterised SQL query使用参数化 SQL 查询执行 ADODB 命令失败
【发布时间】:2012-10-25 08:47:30
【问题描述】:

我有以下 JScript 代码:

var conn = new ActiveXObject ("ADODB.Connection");
conn.Open("Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=blah_blah_blah;User=foo;Password=bar;");
var cmd = new ActiveXObject("ADODB.Command");
cmd.ActiveConnection = conn;

var strSQL = "SELECT id FROM tbl_info WHERE title LIKE :search ORDER BY id";
var search = "test";

try{
    cmd.CommandText = strSQL;
    var param = cmd.CreateParameter(':search', 200, 1, 100, search);
    cmd.Parameters.Append(param);
    var rs = cmd.Execute();
    }
catch (ex) {
    Application.Alert("Error retrieving id information from database.");
}

我已经验证(通过打印)Connection 对象设置为 Command 的 ActiveConnection,参数对象具有正确的值,并且 Command 对象具有正确的 SQL 查询作为其 CommandText。我还在 try 块中的每一行之后插入了一条警告语句,以查看错误发生的位置 - 在 cmd.Parameters.Append 之后很好,但是在运行 Execute 语句时会引发异常。

我已尝试显示实际异常,但它只是一般的“对象错误”消息。

当我直接通过 Connection 对象执行 SQL 查询(不带参数)时,查询执行良好并返回正确的结果集,但当我对 Command 对象使用参数化查询时似乎失败了。

据我所知,Command 和 Connection 对象的所有设置和属性都是正确的,但无论出于何种原因,它都会引发异常。

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: mysql ado jscript


    【解决方案1】:

    对于 ODBC 和 ADO,一般来说,问号? 用作参数的占位符。参数按照它们附加到Parameters 集合的顺序绑定到命令中的占位符。在您的示例中,将 strSQL 替换为:

    var strSQL = "SELECT id FROM tbl_info WHERE title LIKE ? ORDER BY id";
    

    您仍然可以命名您创建的参数,但它的唯一用途是以后能够通过名称引用它(例如,使用cmd.Parameters.Item(":search"))。

    【讨论】:

    • 效果很好,谢谢。但是,现在我遇到了一个问题,即我还有其他使用多个参数的查询,但它们都使用 same 参数。所以我有一个参数(例如称为 :search),它在同一个查询中被多次引用。因为,正如您所说,它们是按照附加到参数的顺序绑定的,因此查询失败,因为没有足够的绑定参数。查询是动态生成的,因此无法确切知道需要多少参数。有没有办法解决这个问题?
    • @AdamLazaruso,我不知道。在之前的类似情况下,我在构建查询时创建并附加了参数。
    • 这对我的代码来说可能很棘手,但如果没有其他方法,我相信我可以让它工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多