Ошибка при использовании параметров запроса с запросом cfscript - PullRequest
9 голосов
/ 08 декабря 2011

Вот мой код:

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: line 108

Я могу только предположить, что сделал что-то не так с тем, как мой SQL структурирован с параметрами, но не могу понять, что это такое.Кто-нибудь может увидеть, что я здесь делаю не так?

Ответы [ 3 ]

13 голосов
/ 08 декабря 2011

Парсер для получения параметров не разбивает на возвращаемые значения, только на пробел (что действительно раздражает).Попробуйте сделать следующее:

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

( и ) должны устранить любую проблему, из-за которой парсер не сможет распознать, где: параметры останавливаются и запускаются.

6 голосов
/ 10 декабря 2011

Эта ошибка возникает из-за символов табуляции и разрыва строки, найденных в вашем операторе 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"))
0 голосов
/ 27 января 2017

ColdFusion может запутаться при разборе строки SQL для использования параметров.Самый простой способ устранить этот недостаток - поставить пробел после каждого из ваших параметров.

Поскольку некоторые текстовые редакторы могут удалять конечные пробелы, как при сохранении, я включаю пустой комментарий после любого пробела в концелиния.

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