Можно ли иметь динамически генерируемые имена запросов в ColdFusion?

Я пытаюсь сделать

<cfloop array="#LOCAL.someArray" index="LOCAL.aString">

    <cfset LOCAL.queryName = "uniqueQueryName_" & LOCAL.aString />

    <cfquery name="#LOCAL.queryName#" datasource="db" cachedwithin="#CreateTimeSpan(1,0,0,0)#">
        SELECT count(*) AS c FROM someTable
    </cfquery>

    <cfdump var="#LOCAL.queryName#" />
</cfloop>

возможно ли это, или есть лучший способ сделать это?

Изменить

Это работает с <cfloop query="LOCAL.queryName">, но не когда я пытаюсь сделать <cfset ArrayAppend(LOCAL.returnArray, LOCAL.queryName.c) />


person John    schedule 16.10.2012    source источник
comment
Вы пытались это сделать? У вас есть ошибки?   -  person Sean Walsh    schedule 16.10.2012
comment
Когда я запускаю его <cfdump>, просто выводит строковое значение имени, uniqueQueryName_foo, uniqueQueryName_bar и т. Д.   -  person John    schedule 16.10.2012
comment
Для динамического доступа к строке запроса используйте нотацию ассоциативного массива, например Local["nameOfQuery"]["theColumnName"][rowNumber]   -  person Leigh    schedule 16.10.2012
comment
аааа да, прицелы обрабатываются как структуры в CF, я забыл об этом, хорошее решение.   -  person John    schedule 16.10.2012
comment
@Leigh, вы оставляете ответы в комментариях, чтобы дать другим возможность заработать баллы, потому что это определенно правильный ответ.   -  person JamesRLamar    schedule 16.10.2012
comment
@JamesRLamar - Иногда да, или когда у меня нет времени написать твердый (проверенный) ответ.   -  person Leigh    schedule 16.10.2012


Ответы (2)


Для этого нет необходимости использовать evaluate(), да и не следует (так что я проголосовал против этого ответа, извините).

Все, что вам нужно сделать, это использовать нотацию ассоциативного массива:

<cfdump var="#local[qname]#">

Если кто-то хочет получить доступ к столбцу этого запроса, он:

#local[qname][columnName]#

И для конкретной ячейки:

#local[qname][columnName][rowNumber]#

Очень, очень и очень мало ситуаций, в которых evaluate() является правильным ответом на что-либо. Нельзя полагаться на документацию Adobe, потому что, к сожалению, очень много ее было написано не очень опытными разработчиками ColdFusion.

person Adam Cameron    schedule 16.10.2012
comment
Вы действительно это проверили? Независимо от того, какую комбинацию знаков фунта я использую, я могу заставить этот метод работать только с <cfdump>, что не очень полезно. - person John; 16.10.2012
comment
@johnthexiii - Работает нормально. Я подозреваю, что проблема в том, что ваш исходный код помещает запрос в область variables, а не local. Объявление вашего запроса должно выглядеть примерно так: <cfquery name="LOCAL.#someDynamicNameHere#" ..> - person Leigh; 16.10.2012
comment
Я не предлагал скопировать и вставить, и это работает код: он просто демонстрировал синтаксис (и, да, он действительно работает). Я должен признать, что предполагал, что вы определяете локальную область видимости своих переменных в соответствии с вашим первоначальным примером. - person Adam Cameron; 17.10.2012
comment
Я бы посоветовал для начала не оставлять запрос плавающим в области видимости переменной. Просто создайте структуру для хранения этого и любых других связанных данных. - person Rumpleteaser; 17.10.2012

Вы можете сбросить запрос, и я думаю, также получить к нему доступ, выполнив что-то вроде этого:

<cfloop list="q1,q2,q3" index="qname">


    <cfquery name="#qname#" datasource="dsn">
        SELECT * from some_table;
    </cfquery>

    <cfdump var="#Evaluate('#qname#')#" />
</cfloop>

Функция Evaluate позволяет вам делать то, что вы хотеть.

person Blaise Swanwick    schedule 16.10.2012
comment
Это работает, Adobe даже использует Evaluate с запросом в своих документах. - person John; 16.10.2012
comment
Не доверяйте примерам в документации Adobe - к сожалению, они не всегда разумны. - person Peter Boughton; 16.10.2012
comment
@johnthexiii - Никогда не думайте, что фрагменты в документации всегда являются примерами хороших практик программирования. Они предназначены только для демонстрации и не всегда используют передовой опыт. Обычно evaluate не приветствуется. В первую очередь потому, что это редко требуется, но в некоторых ситуациях это также может представлять угрозу безопасности. В вашем коде это не нужно. Просто используйте обозначение ассоциативного массива. - person Leigh; 16.10.2012