2

我面临一个奇怪的问题。

当我将以下代码片段作为驻留在 CF9 服务器中的 Web 服务使用时,我收到错误“ The value coldfusion.runtime.Struct cannot be convert to a number。”

该调用返回一个结构数组。我想从这个结构数组创建一个查询。当我将此代码作为独立代码放在本地服务器(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>
4

1 回答 1

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 中运行了这个,所以对你来说应该可以正常工作。

这应该让你继续前进。

于 2013-11-23T04:12:17.223 回答