2012-10-16 85 views
2

我所試圖做的是是否可以在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) />

+1

你嘗試過嗎?你有什麼錯誤嗎? –

+0

當我運行它''時,只是輸出名稱的字符串值,'uniqueQueryName_foo','uniqueQueryName_bar'等。 – John

+4

要動態訪問查詢行,請使用關聯數組表示法'Local [「nameOfQuery」] [ theColumnName「] [rowNumber]' – Leigh

回答

10

有沒有必要使用evaluate()做到這一點,而不應該(所以我已經低調了答案,對不起)。

所有你需要做的是使用關聯數組表示法:

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

如果想訪問該查詢的一列,它是:

#local[qname][columnName]# 

而對於一個特定的細胞:

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

有非常非常少的情況evaluate()是正確的答案任何事情。人們不能依賴於Adobe文檔,因爲 - 不幸的是 - 很多文檔不是由非常有經驗的ColdFusion開發人員編寫的。

+0

你真的測試過它嗎?無論我使用哪種英鎊符號組合,我都只能通過''這個方法來使用這個方法,這並不是很有用。 – John

+1

@johnthexiii - 它工作正常。我懷疑問題是你的原始代碼將查詢放在'變量'範圍內,而不是'本地'。你的查詢聲明應該更像這樣:'' – Leigh

+1

我並不是說它是複製和粘貼它的工作原理:它只是演示語法,它確實有效)。我必須承認,我假設你是本地的,按照你的最初的例子來確定你的變量。 –

0

你可以轉儲查詢,和我想象中還做這樣的訪問:

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


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

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

Evaluate功能是什麼讓你做你想做的。

+0

這是行得通的,Adobe甚至在他們的文檔中使用了查詢和查詢。 – John

+3

不要相信Adobe的文檔中的例子 - 不幸的是,它們並不總是明智的。 –

+3

@johnthexiii - 永遠不要假設文檔中的片段始終是良好編碼實踐的例子。他們只是爲了演示,並不總是使用最佳做法。通常不鼓勵「評估」。主要是因爲它很少需要,但它也可能在某些情況下帶來安全風險。在你的代碼中,它是不需要的。只需使用關聯數組表示法。 – Leigh

相關問題