SQL-массив возвращается как число, а не строка в ColdFusion - PullRequest
0 голосов
/ 16 ноября 2010

В Coldfusion я использую cfc, который связывает один блок выбора с другим (в основном, выбирают штат из одного блока, второй блок заполняется названиями округов.) Значение для поля округов состоит из 5 цифрчисло, которое форматируется как текст (то есть значение приходит из текстового поля).

Проблема в том, что я обнаружил, что если значение идентификатора выбранного округа начинается с «0», оноотрезать.

Таким образом, я получаю такие вещи, как: ID County 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 для заполнения массива RESULT:

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

1 голос
/ 17 ноября 2010

Если данные имеют фиксированную длину, вы можете использовать NumberFormat для принудительной установки нуля в начале. В общем, CF не имеет типа, поэтому должно произойти какое-то основное преобразование, которое приведет к повреждению данных. Вы можете попытаться принудительно заставить значение toString () или отладить, добавив что-то вроде одинарной кавычки в качестве первого символа в значении столбца (например, SELECT '' '' + FIPS_County, '' '' + CountyName FROM lkuCnty), чтобы проверить они сохраняют всех своих персонажей.

[Update] Исходя из ваших комментариев о том, что 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
1 голос
/ 16 ноября 2010

добавьте пробел к концу числа, тогда CF будет рассматривать его как строку, и ни один из ведущих нулей не будет обрезан.

простой обходной путь: <cfset result[i][1]=data.StateUSAbb[i] & " ">

Кстати, вы знаете, что объект запроса поддерживается для заполнения cfselect верно? Так что вам даже не нужна петля. Вы можете сделать тот же обходной путь, но в SQL внутри вашего cfquery

ОБНОВЛЕНИЕ: в любом случае, идея заключается в том, что если вы хотите сохранить начальный 0 и продолжать использовать CF, встроенный в serializeJSON () или вызываете удаленный метод cfc в стиле JSON (который будет вызывать serializeJSON ( ), вы можете добавить пробел, так что CF будет обрабатывать его как строку, и будет сохраняться начальный 0. Если вашему скрипту как-то нужно «012345» без пробела, то ищите другой сепаратор JSON из riaforge или cflib.

0 голосов
/ 17 ноября 2010

Вы уверены, что данные, возвращаемые по вашему запросу, представляют собой текстовую строку, которая содержит начальный ноль, а не только целочисленное значение?Несмотря на это, я думаю, что предложение Захария о NumberFormat (x, "00000") - это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...