Странная ошибка ColdFusion 10 при использовании cfquery cfqueryparam

Я использую ColdFusion 10 Update 23 с базой данных MySQL. Когда я вношу изменения в сценарий, где я использую cfqueryparm, сценарий вызывает это сообщение об ошибке: «Не удалось определить тип значения атрибута тега queryparam».

Этот скрипт работает отлично:

<cfquery name="i" datasource="tasktrack">
UPDATE qa_commitments
SET 
    commit_division = <cfqueryparam cfsqltype='cf_sql_integer' value='#trim(commit_division)#'/>,
    commit_source = <cfqueryparam cfsqltype='cf_sql_varchar' value='#ucase(trim(commit_source))#'/>,
    commit_title = <cfqueryparam cfsqltype='cf_sql_varchar' value='#ucase(trim(commit_title))#'/>,
    commit_responsibility = <cfqueryparam cfsqltype='cf_sql_varchar' value='#ucase(trim(commit_responsibility))#'/>,
    <cfif Len(commit_cause)>commit_cause = <cfqueryparam cfsqltype='cf_sql_varchar' value='#commit_cause#'/>
    <cfelse>commit_cause = NULL</cfif>,
    commit_comments = <cfqueryparam cfsqltype='cf_sql_varchar' value='#ucase(trim(PreserveSingleQuotes(commit_comments)))#'/>,
    commit_issue_date = <cfqueryparam cfsqltype='cf_sql_date' value='#commit_issue_date#'/>,
    commit_response_due_date = <cfqueryparam cfsqltype='cf_sql_date' value='#commit_response_due_date#'/>,
    commit_response_compl_date = <cfqueryparam cfsqltype='cf_sql_date' value='#commit_response_compl_date#'/>,
    commit_action_due_date = <cfqueryparam cfsqltype='cf_sql_date' value='#commit_action_due_date#'/>
    <cfif IsDefined('commit_closeing_date')> ,commit_closeing_date = <cfqueryparam cfsqltype='cf_sql_date' value='#commit_closeing_date#'/></cfif>
WHERE ID = #id# 

Если я открою сценарий и добавлю что-либо (например, возврат, вкладку, комментарий), сохраните сценарий, я получаю указанную выше ошибку. Если я восстановлю скрипт из более старой версии, он снова будет работать нормально. Я открываю старый, вставляю разрыв строки с клавишей ввода, сохраняю его, а затем он снова ломается. Действительно странная часть заключается в том, что если я полностью удалю теги cfqueryparam, скрипт снова заработает. Это происходит в каждом скрипте, где я использую этот тег. Последнее обновление CF было в апреле 2017 года, и есть несколько новых скриптов, которые работают, если я их не отредактирую. Я пробовал разные редакторы с тем же результатом. Я погуглил свою задницу без результатов. Может кто-нибудь указать мне в правильном направлении?


person user3897581    schedule 24.10.2017    source источник
comment
Похоже, вам может понадобиться очистить кеш запросов в CFAdministrator.   -  person snackboy    schedule 24.10.2017
comment
Добавьте фразу id = id сразу после слова set и закомментируйте остальные поля. Запустите страницу. Затем раскомментируйте одно поле за раз и запустите страницу, пока не определите виновника. commit_division выглядит подозрительно, потому что вы используете обрезку для чего-то, что должно быть целым числом.   -  person Dan Bracuk    schedule 24.10.2017
comment
Я очистил запрос, как было предложено, но это не имело значения.   -  person user3897581    schedule 24.10.2017
comment
поле commit_division было правкой, которую я пытался внести. Изменение его с междометия на текст. Я оставил обрезку после ошибки, когда сделал ее varchar.   -  person user3897581    schedule 24.10.2017
comment
Как я упоминал в посте, это общесистемная проблема, а не только этот скрипт. Я получаю ту же ошибку, когда редактирую скрипт, который работает уже два года.   -  person user3897581    schedule 24.10.2017
comment
Просто чтобы убедить себя, я попробовал id=#id# сам по себе, и это сработало, поэтому я добавил строку гнезда и получил ошибку. commit_division = ‹cfqueryparam cfsqltype='cf_sql_varchar' value='#trim(commit_division)#'/›   -  person user3897581    schedule 24.10.2017
comment
Я играл в музыкальные стулья с каждой строкой, и для любой строки, содержащей параметр cfqueryparam, возникала ошибка. Если бы id= id сработало, я бы попробовал SET id= ‹cfqueryparam cfsqltype='cf_sql_interger' value='#(id)#'/›, но это не удалось. По какой-то причине мой coldfusion больше не работает с cfqueryparam.   -  person user3897581    schedule 24.10.2017
comment
Почему id в скобках? И я предполагаю, что это опечатка, написанная cf_sql_integer неправильно.   -  person snackboy    schedule 24.10.2017
comment
Извините, да просто опечатка целое число. Пробовал с '' и без разницы. Обычно я не использую целые числа, но на данный момент я сомневаюсь во всем. Я пробовал и то, и другое. То же сообщение об ошибке.   -  person user3897581    schedule 24.10.2017
comment
Приведенный выше код работает, верно? Можете ли вы опубликовать код, который не работает?   -  person snackboy    schedule 25.10.2017
comment
Если я открою скрипт, который работает правильно, сделайте простое редактирование, например, добавьте строку возврата в конец файла, сохраните файл. Запустите его, и он выдаст сообщение об ошибке, указанное выше. Ничто из того, что я делаю, не исправит файл, кроме как восстановить его из резервной копии. После повторного сохранения файла происходит сбой.   -  person user3897581    schedule 25.10.2017
comment
Неважно, какой текстовый редактор я использую, если я редактирую его, он не работает. За исключением того, что если я удалю все теги cfqueryparam, тогда это сработает. Я начинаю думать, что это вызвано недавним изменением McAfee ИТ-специалистами, но я не могу доказать. McAfee является причиной многих моих проблем на этом сервере.   -  person user3897581    schedule 25.10.2017
comment
Какой текстовый редактор вы используете?   -  person snackboy    schedule 25.10.2017
comment
В Eclipse, notpad, notepad plus даже другой пользователь редактировал и сохранял с теми же результатами.   -  person user3897581    schedule 25.10.2017
comment
Хммм... это почти звучит так, как будто вставляются специальные символы. Вы упомянули McAfee — у вас есть доступ к файлу напрямую с сервера?   -  person snackboy    schedule 25.10.2017
comment
Да, через общий доступ, и я даже пробовал с удаленного рабочего стола напрямую на сервер. Все, кроме того, чтобы пойти в серверную и изменить его непосредственно на самом сервере. Знаете ли вы, что при использовании тега cfqueryparam вызывается или используется java-подобный файл, доступ к которому может быть получен во время запуска сценария, а затем McAfee попытается отсканировать файл «scriptscan» и помешает его правильной интерпретации?   -  person user3897581    schedule 25.10.2017
comment
Учитывая, что все CF построены на java, то да. Но это не объясняет, почему файлы работают до того, как они будут отредактированы, если только что-то не влияет на них из-за их даты файла. Есть ли у вас среда разработки/тестирования, в которой McAfee можно отключить?   -  person snackboy    schedule 25.10.2017


Ответы (2)


Я не могу сказать вам, почему он сломался, но я могу сказать вам, как я бы это починил.

Помещение <cfif> внутри запросов делает так, что механизм БД не может кэшировать запрос. Поэтому я бы удалил их и исключил условную логику в запросе.

<cfquery name="i" datasource="tasktrack">
DECLARE @commit_clause varchar(40) = <cfqueryparam cfsqltype='cf_sql_varchar' value='#commit_cause#' null="#IIF(len(commit_clause)1, 0)#"/>
DECLARE @commit_closeing_date date = cfqueryparam cfsqltype='cf_sql_date' value='#commit_closeing_date#' null="#IIF(isDefined(Commit_closeing_date), 0, 1)#"/>.

UPDATE qa_commitments
SET 
    commit_division = <cfqueryparam cfsqltype='cf_sql_integer' value='#trim(commit_division)#'/>,
    commit_source = <cfqueryparam cfsqltype='cf_sql_varchar' value='#ucase(trim(commit_source))#'/>,
    commit_title = <cfqueryparam cfsqltype='cf_sql_varchar' value='#ucase(trim(commit_title))#'/>,
    commit_responsibility = <cfqueryparam cfsqltype='cf_sql_varchar' value='#ucase(trim(commit_responsibility))#'/>,
    commit_cause = @commit_clause,
    commit_comments = <cfqueryparam cfsqltype='cf_sql_varchar' value='#ucase(trim(PreserveSingleQuotes(commit_comments)))#'/>,
    commit_issue_date = <cfqueryparam cfsqltype='cf_sql_date' value='#commit_issue_date#'/>,
    commit_response_due_date = <cfqueryparam cfsqltype='cf_sql_date' value='#commit_response_due_date#'/>,
    commit_response_compl_date = <cfqueryparam cfsqltype='cf_sql_date' value='#commit_response_compl_date#'/>,
    commit_action_due_date = <cfqueryparam cfsqltype='cf_sql_date' value='#commit_action_due_date#'/>,
    commit_closeing_date = @commit_closeing_date
WHERE ID = #id# /* I would fix this too */
</cfquery>

Не по теме

Я бы рассмотрел возможность использования Entities. Я действительно не люблю писать этот материал снова и снова.

person James A Mohler    schedule 25.10.2017

Я нашел проблему, и проблема заключалась в сканировании сценариев McAfee. Я попросил айтишников отключить его, и теперь скрипт работает. ИТ-отдел винит в этом старую версию Windows Server 2008 и проблемы с McAfee Enterprise. Спасибо за помощь. Это действительно помогает просто иметь кого-то, кто проведет вас через вещи.

person user3897581    schedule 26.10.2017