Coldfusion - 循环数据库查询结果时的变量字段名称

时间:2009-06-30 15:23:40

标签: sql variables coldfusion

我在表格中有一组列名称 - 例如foo1,foo2,foo3,foo4。我想通过循环动态引用这些列名:

<cfloop index="i" from="1" to="4">
  <cfset foo = Evaluate("query.foo" & i)>
</cfloop>

以上操作不起作用 - 即使 query.foo1 是对查询结果的有效引用,ColdFusion也会抛出“未定义变量”错误。我怎么能这样做?

2 个答案:

答案 0 :(得分:21)

不要将Evaluate()用于此类事情!它很慢而且should be avoided

<cfloop index="i" from="1" to="4">
  <cfset foo = query["foo" & i][query.CurrentRow]>
</cfloop>

或者,如果您愿意:

<cfloop index="i" from="1" to="4">
  <cfset foo = query["foo#i#"][query.CurrentRow]>
</cfloop>

Evaluate()用于评估代码位。不要将它用于可以通过语言集成,更合适的方式更优雅地解决的问题。

编辑:

使用“尖括号”-syntax访问Query对象时,必须附加(从1开始)的行号索引(query["foo#i#"][RowNum])。使用传统的“dot”-syntax(query.foo1)时,当前行是隐式的。

要显式访问当前行,请使用QueryObject.CurrentRow属性。但它可以是QueryObject.RecordCount之前的任何正整数。建议对CurrentRow以外的任何其他内容进行范围检查。

这会打开一个有趣的字段:您可以开始使用“随机访问”查询对象。以前(在CFMX之前)你所能做的就是从头到尾迭代它们,拉出你要找的东西。现在它就像一个嵌套的struct / array数据结构,你可以用不同的方式使用它。

答案 1 :(得分:1)

你非常接近。试试这个:

<cfset query.foo1 = "foo val 1">
<cfset query.foo2 = "foo val 2">
<cfset query.foo3 = "foo val 3">
<cfset query.foo4 = "foo val 4">

<cfloop index="i" from="1" to="4">
        <cfset foo = Evaluate("query.foo#i#")>
        <cfoutput>#foo#<br></cfoutput>
</cfloop>