2

私は奇妙な問題に直面しています。

以下のコード スニペットを 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>
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];
        }
    }

これは、上記の同じ二重ループを 1 行で短くしたものです。

    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 に答える