ListGetAt函数返回类型转换错误

ListGetAt函数返回类型转换错误,list,coldfusion,List,Coldfusion,我有以下代码: <cfif SideSell neq ""> <cftry> <cfif listlen(SideSell, ",") gt 0> <cfset sidesellvalid = true> <cfelse> <cfset sidesellvalid = false> </cfif>

我有以下代码:

<cfif SideSell neq "">
    <cftry>
        <cfif listlen(SideSell, ",") gt 0>
            <cfset sidesellvalid = true>
            <cfelse>
            <cfset sidesellvalid = false>
        </cfif>
        <cfcatch type="any">
            <cfset sidesellvalid = false>
        </cfcatch>
    </cftry>
    <cfif sidesellvalid>
        <cfset AddPartNumber = "">
        <cfset AddDescription = "">
        <cfset AddQuantity = "">
        <cfset AddPrice = "">
        <cfset OptionPrice = "">
        <cfset AddItem = "">
        <cfloop list="FORM.SideSell" index="SideSellListIndex" delimiters=",">
            <cfquery name="qSideSellParts" datasource="Pascal">
                SELECT * from Part WHERE PartNumber = <cfqueryparam cfsqltype="cf_sql_varchar" list="yes" separator="," maxlength="45" value="#ListGetAt(SideSell, SideSellListIndex, ',')#">
            </cfquery>
            <cfset AddPartNumber = "#qSideSellParts.PartNumber#">
            <cfset AddDescription = "#qSideSellParts.SubCategory#">
            <cfset AddQuantity = "1">
            <cfset AddPrice = "#qSideSellParts.PartPrice1#">
            <cfset OptionPrice = "0">
            <cfset AddItem = "Add To Cart">

            <cfinclude template="checkpart.cfm">
        </cfloop>
    </cfif>
</cfif>

从零件号=
然而,CF抛出了一个类型转换异常,表示

“值FORM.SideSell无法转换为数字。”

在SQL行:

SELECT * from Part WHERE PartNumber = <cfqueryparam cfsqltype="cf_sql_varchar" list="yes" separator="," maxlength="45" value="#ListGetAt(SideSell, SideSellListIndex, ',')#">
从零件号=
我尝试过的测试数据包括“PTI 19-1”和“PTI 19-1,PTI 19-2”,因此无论列表项计数如何,问题都存在。我是否只是缺少或误用了引号


编辑:在我的测试服务器上运行CF9,在生产服务器上运行CF8。我使用了
标记来验证数据是否符合我的预期,事实确实如此。

您误解了cfloop如何与list属性一起工作-您不需要ListGetAt,因为该值包含在索引中

(从技术上讲,这并不准确——它应该是
item
,因为这正是您得到的,但是最初实现cfloop的人就是这样做的,我们一直在使用它。)

还要注意,列表必须是字符串,而不是变量名,所以需要使用哈希将变量计算为1

最后,由于一次只循环列表中的一个项目,因此不应使用cfqueryparam的list属性-(这适用于在(x,y,z)样式查询中执行
WHERE PartNumber并希望将参数视为多个值时。)

总之,您的循环应该如下所示

<cfloop list=#Form.SideSell# index="PartNumber">
    <cfquery name="qSideSellParts" datasource="Pascal">
        SELECT * from Part
        WHERE PartNumber = <cfqueryparam cfsqltype="cf_sql_varchar" value="#PartNumber#">
    </cfquery>
    ...
</cfloop>

从零件中选择*
其中零件号=
...

(如果您不明白原因,请添加评论,我将尝试进一步解释。)

非常感谢。我忘了该值包含在索引变量中。我同意,它应该是
项目
,而不是
索引
!然而,错误信息具有误导性;CF不应该抱怨SideSellListIndex变量吗?它是在抱怨SideSellListIndex变量-由于list属性上缺少哈希,该变量的值是字符串“FORM.SideSell”,这就是错误报告为非数字的原因。还要注意,列表必须是字符串,而不是变量名,因此您需要哈希来将变量计算为1。不知怎么的,我完全错过了这个。如果是这种情况,那么为什么CF8文档会声明:attribute:List Description“一个列表、变量或文件名;包含一个列表?”?好问题。我不知道为什么这么说,但这是错的。list属性接受字符串值(或结果为字符串值的表达式),但不会将字符串转换为变量名或文件名。该部分试图同时解释三种不同类型的循环(list、array和file)。看起来他们把事情搞砸了。