SQL数组作为数字返回,而不是ColdFusion中的String

时间:2010-11-16 17:36:28

标签: sql arrays coldfusion cfc

在Coldfusion中,我使用的是将一个选择框绑定到另一个选择框的cfc(基本上,从一个框中选择一个状态,第二个框填充了县名。)County框的值是5位数数字格式为TEXT(即值来自文本字段。)

问题在于,我发现如果所选县id的值以'0'开头,则会被切断。

所以我得到的东西: ID县 11223 A. 2300 B(应为02300)

有人可以帮助确保前导0没有被切断吗?

这是页面上的选择框:

 <!--- State Name options --->
    <b>State:</b><br />
    <cfselect bind="cfc:states.getStates()" bindonload="true" name="search_state" id="search_state" value="StateUSAbb" display="StateName">
    </cfselect><br />

  <!--- County Name options --->
    <b>County:</b><br />
    <cfselect bind="cfc:states.getCounties({search_state})" name="search_county" id="search_county" value="FIPS_County" display="CountyName">
    </cfselect>

我讨厌粘贴整个.cfc,但要注意后一部分,特别是cfloop使用cfset来填充数组结果:

<cfcomponent output="false">

    <!--- Get array of media types --->
    <cffunction name="getStates" access="remote" returnType="array">
        <!--- Define variables --->
        <cfset var data="">
        <cfset var result=ArrayNew(2)>
        <cfset var i=0>

        <!--- Get data --->
        <cfquery name="data" datasource="bridges">
       SELECT DISTINCT tblLoc.StateUSAbb, lkuState.StateName
        FROM lkuState INNER JOIN tblLoc ON lkuState.FIPS_State = tblLoc.FIPS_State
        WHERE (lkuState.StateName <> 'New Brunswick')
        UNION
        SELECT '' AS StateUSAbb, ' ALL' AS StateName
        FROM lkuState
        ORDER BY StateName
        </cfquery>

        <!--- Convert results to array --->
        <cfloop index="i" from="1" to="#data.RecordCount#">
            <cfset result[i][1]=data.StateUSAbb[i]>
            <cfset result[i][2]=data.StateName[i]>
        </cfloop>

        <!--- And return it --->
        <cfreturn result>
    </cffunction>

    <!--- Get counties by state --->
    <cffunction name="getCounties" access="remote" returnType="array">
        <cfargument name="stateabb" type="string" required="true">

        <!--- Define variables --->
        <cfset var data="">
        <cfset var result=ArrayNew(2)>
        <cfset var i=0>

        <!--- Get data --->
        <cfquery name="data" datasource="bridges">
        SELECT '' AS FIPS_COUNTY, ' ALL' as CountyName
        FROM lkuCnty
        UNION
        SELECT FIPS_County, CountyName
        FROM lkuCnty
        WHERE StateAbb = '#ARGUMENTS.stateabb#'
        ORDER BY CountyName
        </cfquery>

        <!--- Convert results to array --->
        <cfloop index="i" from="1" to="#data.RecordCount#">
            <cfset result[i][1]=data.FIPS_County[i]>
            <cfset result[i][2]=data.CountyName[i]>
        </cfloop>

        <!--- And return it --->
        <cfreturn result>
    </cffunction>

</cfcomponent>

3 个答案:

答案 0 :(得分:1)

在数字的末尾附加一个空格,然后CF将其视为一个字符串,并且不会切断前导0。

简单的解决方法:<cfset result[i][1]=data.StateUSAbb[i] & " ">

顺便说一句,您知道查询对象是否支持填充cfselect对吗?所以你甚至不需要循环。您可以在cfquery

中的SQL中执行相同的解决方法

UPDATE:无论如何,想法是如果你想保留前导0并继续使用CF内置的serializeJSON()或以JSON样式调用cfc远程方法(这将在内部调用serializeJSON (),你可以附加一个空格,这样CF就会把它当成一个字符串,并且前导0将被保留。如果你的脚本必须以某种方式必须“012345”没有尾随空格,那么从riaforge或cflib中寻找另一个JSON seralizer。

答案 1 :(得分:1)

如果数据是固定长度,您可以使用 NumberFormat 强制前导零。通常,CF是无类型的,因此必然会发生一些导致数据损坏的底层转换。您可以尝试强制值toString(),或调试添加类似单引号的内容作为列值中的第一个字符(例如SELECT''''+ FIPS_County,''''+ CountyName FROM lkuCnty)以查看是否他们保留了所有角色。

<强> [更新] 根据您对SQL如何不返回5个字符的注释,使用此更新的查询从INT到VARCHAR以前导零。

  SELECT DISTINCT 
    RIGHT('00000' + CONVERT(VARCHAR(5),StateUSAbb),5), 
    lkuState.StateName
         FROM lkuState INNER JOIN tblLoc ON lkuState.FIPS_State = tblLoc.FIPS_State
         WHERE (lkuState.StateName <> 'New Brunswick')
  UNION
     SELECT '' AS StateUSAbb,
     ' ALL' AS StateName
          FROM lkuState
          ORDER BY StateName

答案 2 :(得分:0)

您确定查询返回的数据是一个包含前导零的文本字符串,而不仅仅是整数值吗?无论如何,我认为Zachary对NumberFormat(x,“00000”)的建议是可行的。