前文: 古いサーバーを廃止するため、新しいサーバーに移動する必要がある動作中のアプリケーションがいくつかあります。その結果、CF の新しいインスタンスをインストールする必要がありました。
このアプリケーションは、ColdFusion バージョン "9,0,0,251028" Standard エディション (ColdFusion Administrator 経由) を実行している古いサーバーで正常に動作します。
新しいサーバーでは、CF 2016 バージョン 2016.0.0.298074 開発者版を使用しています (Google 検索で最初に表示されたので、それを使用しました)。
今問題:次のようなエラーを与えるコードがあります:
複雑なオブジェクト型を単純な値に変換することはできません。
式は変数または中間式の結果を単純な値として要求しました。ただし、結果を単純な値に変換することはできません。単純な値は、文字列、数値、ブール値、および日付/時刻値です。クエリ、配列、および COM オブジェクトは、複雑な値の例です。エラーの原因として最も可能性が高いのは、複雑な値を単純な値として使用しようとしたことです。たとえば、cfif タグでクエリ変数を使用しようとしました。
エラーは G:/Gumbo/components/modules/resource/ResourceAdmin.cfc: line 282 Called from G:/Gumbo/admin/modules/resource/action.cfm: line 34 Called from G:/Gumbo/admin/action で発生しました.cfm: 19 行目
281 cfloop query="getseq"> 282 <cfif getseq.resourceCategoryID IS temp><cfset newseq = getseq.displaySeq ><cfbreak></cfif> 283 </cfloop>
問題の行は 282 です。問題のコードは次のとおりです。
<cfloop query="getseq">
<cfif getseq.resourceCategoryID IS temp><cfset newseq = getseq.displaySeq ><cfbreak></cfif>
</cfloop>
私の調査によると、ColdFusion の一部のバージョンでは cfloop がクエリ パラメータで動作しないように見えますが、新しいバージョンでこのエラーが発生する理由がわかりません。
だから私の質問は:
どうにかしてこの古いバージョンの CF を再取得する方法はありますか? 古いコンピューターにCF9ソースフォルダーがあることを覚えておいてください。ただし、ソースファイルを取得してそれらを移動するか、手動でインストールするか、またはその内外をインストールする方法があるかどうかはわかりませんでした. 古いソース ファイルを新しいサーバー上の新しい CF ソースにコピーするのと同じくらい簡単でしょうか?
上記のコードを変更する簡単な代替手段は何ですか? これは、この仕事に就いたときに受け継いだ古いプロジェクトであるため、CF にはまったくなじみがありません。新しいシステムで正確なバージョンを取得したいのですが、コードを変更することが唯一の実行可能な代替手段です。
任意の洞察をいただければ幸いです。
編集:
問題のある関数全体は次のとおりです。
<cffunction name="updateResource" access="public" output="false" displayname="Update a Resource">
<cfset VARIABLES.dateUpdated=DateAdd("d", 0, arguments.dateUpdated)>
<cfquery datasource="#this.datasource#">
update md_rlm_resource
set published=<cfqueryparam cfsqltype="cf_sql_tinyint" value="#arguments.published#">,
resourceName=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.resourceName#">,
resourceNumber=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.resourceNumber#">,
resourceAuthor=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.resourceAuthor#">,
resourceFile=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.resourceFile#">,
dateUpdated=<cfqueryparam cfsqltype="cf_sql_timestamp" value="#VARIABLES.dateUpdated#">,
shortDescription=<cfqueryparam cfsqltype="cf_sql_longvarchar" value="#arguments.shortDescription#">
where resourceID=<cfqueryparam value="#arguments.resourceID#" cfsqltype="cf_sql_integer">
</cfquery>
<cfquery name="getseq" datasource="#this.datasource#">
select displaySeq, resourceCategoryID
from md_rlm_resourcecategoryrel
where resourceID=<cfqueryparam value="#arguments.resourceID#" cfsqltype="cf_sql_integer">
</cfquery>
<cfquery datasource="#this.datasource#">
delete from md_rlm_resourcecategoryrel
where resourceID=<cfqueryparam value="#arguments.resourceID#" cfsqltype="cf_sql_integer">
</cfquery>
<cfif IsDefined("arguments.resourceCategoryIDs")>
<cfset resourceCategoryID = ArrayNew(1)>
<cfset resourceCategoryID = ListToArray(arguments.resourceCategoryIDs)>
<cfif #ListLen(arguments.resourceCategoryIDs)# gt 1>
<cfset tmp1 = #ArrayLen(resourceCategoryID)#>
<cfelse>
<cfset tmp1 = "1">
</cfif>
<cfloop INDEX="idx" FROM="1" TO="#tmp1#">
<cfset newseq = 1>
<cfif #tmp1# gt 1>
<cfset temp=resourceCategoryID[idx]>
<cfelse>
<cfset temp=resourceCategoryID>
</cfif>
<cfloop query="getseq">
<cfif getseq.resourceCategoryID IS temp><cfset newseq = getseq.displaySeq ><cfbreak></cfif>
</cfloop>
<cfquery datasource="#this.datasource#">
insert into md_rlm_resourcecategoryrel
(resourceCategoryID, resourceID, displaySeq)
values
(
<cfif #tmp1# gt 1>
<cfqueryparam CFSQLTYPE="cf_sql_integer" VALUE="#resourceCategoryID[idx]#">,
<cfelse>
<cfqueryparam CFSQLTYPE="cf_sql_integer" VALUE="#resourceCategoryID#">,
</cfif>
<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.resourceID#">,
<cfqueryparam cfsqltype="cf_sql_float" value="#newseq#">)
</cfquery>
</cfloop>
</cfif>
<cfquery datasource="#this.datasource#">
DELETE FROM md_rlm_resourceregionrel
WHERE resourceID=<cfqueryparam value="#arguments.resourceid#" cfsqltype="cf_sql_integer">
</cfquery>
<cfloop index="regionele" list="#arguments.regionID#" delimiters=",">
<cfquery datasource="#this.datasource#">
INSERT INTO md_rlm_resourceregionrel (resourceID, regionID)
VALUES (<cfqueryparam value="#arguments.resourceid#" cfsqltype="cf_sql_integer">, #regionele#)
</cfquery>
</cfloop>
</cffunction>