序言:所以我們有一些工作的應用程序需要轉移到新的服務器上,因爲我們正在退役一個較舊的應用程序,因此我不得不安裝一個新的CF實例。Coldfusion - 試圖通過cfloop查詢時發生複雜對象錯誤。版本差異?
此應用程序在運行ColdFusion版本「9,0,0,251028」標準版(通過ColdFusion管理員)的舊服務器上正常工作。
在較新的服務器上,我使用的是CF 2016版本2016.0.0.298074開發者版(這是第一個彈出的谷歌搜索,所以我去了它)。
現在問題:有一段代碼給出一個錯誤,指出:
Complex對象類型不能被轉換爲簡單的值。
表達式請求變量或中間表達式結果作爲一個簡單值。但是,結果不能轉換爲簡單的值。簡單值是字符串,數字,布爾值和日期/時間值。查詢,數組和COM對象是複雜值的示例。 錯誤的最可能原因是您嘗試使用複雜值作爲簡單值。例如,您嘗試在cfif標記中使用查詢變量。在G中發生
錯誤:/Gumbo/components/modules/resource/ResourceAdmin.cfc:線282 選自G調用:/Gumbo/admin/modules/resource/action.cfm:線34 選自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>
從我的研究,我已經指出,顯然沒有按CFLOOP不適用於查詢一些ColdFusion版本的參數,但是我不明白的是爲什麼NEWER版本會導致我這個錯誤。
所以我的問題是:
有沒有辦法以某種方式重新獲得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>
您可以在cfrepo上找到歸檔的ColdFusion版本http://www.gpickin.com/cfrepo/至於你的錯誤什麼是'temp'?如果你需要看看變量是什麼,那麼你可以通過'cfdump'來檢查它。 –
temp是一個resourceCategoryID,從另一個數據庫表中獲取並進行比較,以確保ID與我所知道的相同。這對我的理解沒有影響到這個問題,因爲它在其他版本上運行良好。 現在檢出回購,感謝推薦! –
我們正處於同一遷移過程中(CF 9到2016)。我建議你專注於重構你的代碼庫來解決這樣的差異問題,而不是堅持使用舊版本的CF.你是否拋出查詢每一行的內容,併爲循環的每次迭代拋棄「temp」的值?您可能有錯誤的數據,到2016年會有不同的解釋。我們遇到了像CF 9運行的無效函數語法,但不是2016年。我們有一個項目專門用於解決這些類型的代碼差異,然後再發布2016生產。 –