使用cfscript查询的查询参数时出错

时间:2011-12-08 04:09:25

标签: coldfusion

这是我的代码:

var qryStr = "
            UPDATE templates_email 
            SET title = :title, test_emails = :testEmail, body = :body
            WHERE id = :templateID";

q = New Query();
q.setSQL(qryStr);
q.addParam(name="title", value="#arguments.title#", cfsqltype="cf_sql_char");
q.addParam(name="body", value="#arguments.templateContent#", cfsqltype="cf_sql_char");
q.addParam(name="testEmail", value="#arguments.test_emails#", cfsqltype="cf_sql_char");
q.addParam(name="templateID", value="#arguments.id#", cfsqltype="cf_sql_integer");

return q.execute().getResult();

这是错误:

  

在指定的参数列表中找不到参数'body WHERE'

     

SQL:UPDATE templates_email SET title =:title,test_emails =:testEmail,body =:body WHERE id =:templateID

     

错误发生在C:\ ColdFusion9 \ CustomTags \ com \ adobe \ coldfusion \ query.cfc:第108行

我只能假设我使用参数构建SQL的方式有问题,但无法解决它的问题。谁能看到我在这里做错了什么?

3 个答案:

答案 0 :(得分:13)

获取params的解析器不会在返回值上进行标记,仅在空格上(这实在很烦人)。请尝试以下方法:

var qryStr = "
    UPDATE templates_email 
    SET title = ( :title ), test_emails = ( :testEmail ), body = ( :body )
    WHERE ( id = :templateID )
";

()应该删除解析器无法识别:params停止和开始的位置的任何问题。

答案 1 :(得分:5)

由于SQL语句中找到制表符和换行符,会发生此错误。我通常在我的SQL语句下运行函数以删除这些字符。

string function cleanSQL(required string sqlStatement)
    output="false"
{
return trim(reReplace(arguments.sqlStatement, "\t|\n", " ", "all"));
}

所以,你的setSQL()看起来像:

q.setSQL(cleanSQL(qryStr))

或简单地说:

q.setSQL(reReplace(qryStr, "\t|\n", " ", "all"))

答案 2 :(得分:0)

解析SQL字符串以使用参数时,ColdFusion会感到困惑。解决这个缺点的最简单方法是在每个参数后面加一个空格。

由于某些文本编辑器可能会删除尾随空格,例如保存时,我会在行尾的任何空格后包含空注释。

var qryStr = "
    UPDATE templates_email 
    SET title = :title , test_emails = :testEmail , body = :body /**/
    WHERE id = :templateID /**/
";