При обновлении до ColdFusion 9 появляется странная ошибка cfif

У меня есть пара мест, где есть такой код:

<cfinvoke component="#application.path#cfc/eval_faculty" method="getPresentations" returnvariable="presentations">
    <cfinvokeargument name="id" value="#eval_id#">
    <cfinvokeargument name="evalYear" value="#eval_semester#">
    <cfinvokeargument name="department" value="#general.dept#">
</cfinvoke>

<cfset prescheck = 0>
<cfloop query="presentations">
    <cfif local eq "" and regional eq "" and national eq "" and international eq "">
        <cfset prescheck = prescheck+1>
    </cfif>
</cfloop>

Я получаю эту ошибку:

Complex object types cannot be converted to simple values.

Ни одно из этих значений в операторе cfif не является сложным объектом.

Это отлично работало в ColdFusion 8. Мы только что обновились до ColdFusion 9...

Ошибка возникает на строке с <cfif local eq "" ... >

Любые идеи?


person Bri    schedule 07.02.2012    source источник


Ответы (1)


<cfif local eq ""

Возможно, LOCAL теперь является системной областью в CF9, как FORM, URL и так далее. Таким образом, CF жалуется, когда вы пытаетесь выполнить сравнение строк, потому что это структура. Если LOCAL представляет собой простую переменную в вашем старом коде, попробуйте использовать другое имя переменной.

Обновление: из комментариев, если LOCAL — это имя столбца в вашем запросе, вы можете использовать псевдоним sql, чтобы дать ему другое имя:

  SELECT Local AS LocalAlias FROM Table

... или используйте полное имя переменной:

   <cfif queryName.local ...>
person Leigh    schedule 07.02.2012
comment
Что, если я не смогу? Local — это имя атрибута таблицы базы данных. :( - person Bri; 07.02.2012
comment
Этот код используется внутри cffunction? Вы всегда можете использовать псевдоним столбца в запросе SELECT Local AS LocalAlias. Тогда используйте вместо этого псевдоним. Или вы можете попробовать использовать полное имя: например, <cfif queryName.local ...>. - person Leigh; 07.02.2012
comment
О, да. Я такой глупый сегодня. Я забыл, что вы можете сделать AS xxx ... но мне будет неразумно менять это, поскольку оно используется во многих местах. Пока я делаю query.local. Я полагал, что он распознает локальный как находящийся в указанной области запроса, когда я укажу запрос в ‹cfloop›. - person Bri; 07.02.2012
comment
Да, но имя области будет иметь приоритет над именами столбцов запроса. Вы бы получили тот же результат, если бы у вас был, например, столбец базы данных с именем session. - person ale; 08.02.2012
comment
@Al - Верно, но полное определение имени, т.е. queryName.Local, должно избежать этого. - person Leigh; 08.02.2012