ListGetAt函数返回类型转换错误

时间:2012-09-26 13:55:58

标签: list coldfusion

我有以下代码:

<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正在抛出一个类型转换异常,说

  

&#34;值FORM.SideSell无法转换为数字。&#34;

在SQL行:

SELECT * from Part WHERE PartNumber = <cfqueryparam cfsqltype="cf_sql_varchar" list="yes" separator="," maxlength="45" value="#ListGetAt(SideSell, SideSellListIndex, ',')#">

我试过的测试数据包括&#34; PTI 19-1&#34;和&#34; PTI 19-1,PTI 19-2&#34;所以无论列表项计数如何,问题都存在。我只是遗漏或误用引号?

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

1 个答案:

答案 0 :(得分:3)

您误解了cfloop如何使用list属性 - 您不需要ListGetAt,因为该值包含在索引中。

(从技术上讲,这不准确 - 它应该是item,因为那是你得到的,但是最初实施cfloop的人就是这样做的,我们已经做到了一直坚持下去。)

另请注意,list必须是字符串 - 而不是变量名称 - 因此您需要使用哈希值将变量计算为一个。

最后,既然你一次在列表中循环一个项目,那么你应该使用cfqueryparam的list属性 - (这适用于你正在做的事情WHERE PartNumber IN (x,y,z)样式查询并希望将参数视为多个值。)

总之,你的循环应该是这样的。

<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>

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