这是我的代码:
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的方式有问题,但无法解决它的问题。谁能看到我在这里做错了什么?
答案 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 /**/
";