我面临一个奇怪的问题。
当我使用下面的代码片段作为驻留在CF9服务器中的Web服务时,我收到错误“值coldfusion.runtime.Struct无法转换为数字。”
该调用返回一个结构数组。我想从这个结构数组创建一个查询。当我将此代码作为独立代码放在我的本地服务器(CF10)中时,它可以正常工作。但是,一旦我将它放在要调用的远程服务器中,我就会收到错误。
即使我用硬编码结构替换了变量'tempstruct',当我收到相同的错误信息时,我几乎拔出了头发。一旦我删除QueryAddRow,我就能够返回任何内容。
感谢任何帮助。
<cfset myquery=querynew("category,category_id,event_description","varchar,integer,varchar")>
<cfinvoke
webservice="http://199.99.99.999/vod_queries.cfc?wsdl"
method="getAllCategoryByResort"
returnvariable="arrAllSpaEvents"
refreshwsdl="true" >
<cfinvokeargument name="Resort" value="SRB" >
</cfinvoke>
<cfif arraylen(arrAllSpaEvents) GT 0>
<cfloop array="#arrAllSpaEvents#" index="cur_row">
<cfset tempstruct=StructNew()>
<cfset tempstruct.CATEGORY=cur_row.CATEGORY>
<cfset tempstruct.CATEGORY_ID=cur_row.CATEGORY_ID>
<cfset tempstruct.EVENT_DESCRIPTION=cur_row.EVENT_DESCRIPTION>
<cfset QueryAddRow(myquery,#tempstruct#)>
</cfloop>
</cfif>
<cfreturn myquery>
答案 0 :(得分:0)
你几乎得到了。 但是,确实你在CF9中使用新的CF10重载。更重要的是,如果你使用的是CF10,看起来你可以用这样的循环填充整个顶部数组。 但你几乎可以做同样的事情。 CF9将为该值采用数组重载。 不像CF10那么干净,但你尽你所能。
此外,额外的#符号是多余的。
以下是您的数据可能如下所示的示例:
<cfscript> // I did this all in a cfscript block for simplicity
您检索到的数据可能类似于示例
中的猜测 arrAllSpaEvents = [
{category='fun', category_id=1, event_description='massage'},
{category='work', category_id=2, event_description='spinning'},
{category='beauty', category_id=3, event_description='mani'},
{category='beauty', category_id=3, event_description='pedi'}
];
创建一个更有用的结构来动态构建查询
s = {
category = {colType = 'varchar', colVals = []},
category_id = {colType = 'integer', colVals = []},
event_description = {colType = 'varchar', colVals = []}
};
这是循环数据以填充colVals数组
for(c = 1; c <= arrAllSpaEvents.size(); c++ ) {
for(k in arrAllSpaEvents[c]) {
s[k].colVals[c] = arrAllSpaEvents[c][k];
}
}
这是上面同一个双循环的简短形式
for(c = 1; c <= arrAllSpaEvents.size(); c++ ) for(k in arrAllSpaEvents[c]) s[k].colVals[c] = arrAllSpaEvents[c][k];
现在构建您的查询。从空查询开始(传入空白);
q = queryNew('');
然后循环结构并使用列名称的键(为简单起见,它们是相同的键)
for(k in s ) queryAddColumn(q,k,s[k].colType,s[k].colVals);
验证您的结构和查询:
writedump(s);
writedump(q);
</cfscript>
我在CF9中运行它,所以应该可以正常工作。
这应该让你去。