我正在尝试创建一个从查询中创建csv文件的函数。运行查询后,我循环遍历它并将每行的字段附加到StringBuffer对象。为此,我将列名称放入数组中:
<cfset indexes = #ListToArray(Arguments.header)# />
其中参数当前是一个字符串,如:
"col1, col2, col3...."
我已经验证了查询和数组都是通过转储它们应该是什么。 循环查询结果时出现问题。给出:
<cfset indexes_length = #ArrayLen(indexes)# />
<cfloop query="query_for_csv">
<cfloop index="i" from="1" to="#indexes_length#">
<cfset attr = #indexes[i]# />
<cfset sbOutput.Append(
"#query_for_csv[attr][query_for_csv.CurrentRow]#") />
</cfloop>
</cfloop>
在收到错误消息之前,只输出第一行的第一个值:
[Table (rows 10 columns col1, col2, col3):
[col1: coldfusion.sql.QueryColumn@6f731eba]
[col2: coldfusion.sql.QueryColumn@6ee67e7f]
[col3: coldfusion.sql.QueryColumn@5c6647cb]
is not indexable by col2
如果我将变量#attr#替换为文字“col2”:
#query_for_csv['col2'][query_for_csv.CurrentRow]#
然后循环完成没有任何问题,并吐出由'col2'索引的所有值。有什么想法吗?
答案 0 :(得分:4)
我猜你的标题列表中的空格是问题所在,所以可能会有效:
<cfset attr = trim(indexes[i]) />
但是,既然你没有使用它们,你可能不需要它,只能这样做......
<cfloop query="QueryName">
<cfloop index="CurCol" list=#QueryName.ColumnList# >
<cfset sbOutput.Append(
QueryName[CurCol][QueryName.CurrentRow]
)/>
</cfloop>
</cfloop>
P.S。
你会在这里注意到只有一对哈希 - 你的原始代码片段中只需要一对(在to
属性中) - 其余的都是不必要的噪音。
答案 1 :(得分:2)
如前所述,尽量避免在列表元素之前或之后使用空格。
如果您想比较笔记,请查看Ben Nadel选择实施此类Query2CSV转换器的方法:http://www.bennadel.com/blog/1239-Updated-Converting-A-ColdFusion-Query-To-CSV-Using-QueryToCSV-.htm