Cf-скрипт конвертирует результат запроса в структуру с уникальным ключом? - PullRequest
0 голосов
/ 26 сентября 2018

В моей системе есть несколько функций, которые следует преобразовать из CFML в CFSCRIPT.Работая над этим проектом, я столкнулся с ситуацией, когда моя структура выдает больше результатов (много пустых строк), чем нужно, даже запрос возвращает только одну строку.Вот пример моего кода в CFSCRIPT:

cfstoredproc( procedure="GetZip", datasource=Application.dsnRead ) {
    cfprocparam( dbvarname="@Zip", value=trim(52401), cfsqltype="cf_sql_char", maxlength=5 );
    cfprocresult( name="ZipResult" );

}

local.strZip = {};
strZip[ZipResult.RecID] = {
    "City" : trim(ZipResult.City),
    "State" : trim(ZipResult.State)
};

writeDump(strZip);

Вот что я получаю для вывода:

array
1   [undefined array element]
2   [undefined array element]
3   [undefined array element]
4   [undefined array element]
5   [undefined array element]
6   [undefined array element]
7   [undefined array element]
8   [undefined array element]
9   [undefined array element]
10  [undefined array element]
11  [undefined array element]
12  [undefined array element]
13  [undefined array element]
14  [undefined array element] 
...

Мне интересно, каков наилучший способ вывода результата запроса (s) в структуре и использовать RecID в качестве уникального ключа?Этот пример и запрос выше всегда будут возвращать 1 запись за один раз, но мне также интересно, как этот код будет работать, если мне понадобится перебрать результат запроса с несколькими записями?

Обновление: я думаю, что нашел проблему.RecID - это идентификатор автоинкремента в моей таблице базы данных.Когда я возвращаю RecID значение может быть, например, 56743.Так что, если я передам RecID в качестве ключа в моей структуре, это приведет к такому количеству строк в структуре.У меня вопрос как это предотвратить?Есть ли способ просто установить ключ?

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Нет, ты прав.Поскольку это целое число, ColdFusion заполняет массив до точки этого целого числа, поскольку вы не можете иметь массив с кучей пустых значений;они должны иметь какое-то значение, поэтому - как вы видите здесь - они не определены.Вы не можете использовать целое число для структурного ключа.Если вы добавите букву в начале, а затем при нажатии ссылки на это значение, это сработает.Это хакерство, но это то, что я обычно делаю для такого рода вещей.Если вы хотите проверить это, вы можете использовать StructInsert () вместо [].

0 голосов
/ 26 сентября 2018

Я не уверен, почему ваш CF конвертирует strZip в массив, но именно поэтому вы получаете кучу пустых мест.Ключ структуры может быть целым числом, но когда вы скажете массиву вставить x[42], в вашем массиве будет 42 элемента.local.strZip = {}; довольно явно заявляет, что strZip является структурой.Тем не менее, объемы могут быть странными в CF иногда.В зависимости от того, как вы его используете, я думаю, что когда вы делаете strZip[ZipResult.RecID], это может создать новую переменную с незаданной областью, которая является массивом.А затем, когда вы его выгружаете, вы сбрасываете версию массива strZip.Вы можете попробовать использовать local.strZip[ZipResult.RecID] и посмотреть, изменит ли это ваше поведение.Или попробуйте сбросить local.strZip и посмотреть, пусто ли оно.

Или вы можете сделать:

<cfscript>
    // Build a fake query object.
    ZipResult = queryNew(
        "RecID, City, State",
        "integer, varchar, varchar",
        [
              { RecID: 99, City: "Nashville", State: "TN" }
        ]
    );
    writeDump(ZipResult); // What's in our query?


local.strZip = {
    "#ZipResult.RecID#" : {
      City : trim(ZipResult.City) , 
      State : trim(ZipResult.State)
    }
};

writeDump(strZip);

</cfscript>

https://trycf.com/gist/28440630b0aa7ba1642e45bab3503652/acf2016?theme=monokai

ПРИМЕЧАНИЕ: Мне не удалосьпродублируйте ваше поведение в TryCF, но я также вряд ли выполняю этот код в той же области, что и вы. ПОДТВЕРЖДЕНО: https://cffiddle.org/app/file?filepath=50f4e710-bd9b-40dd-a03a-15695bdd5a0d/c476f91b-6931-4295-be67-e4309aecfa0c/0492a7c6-029f-4227-941a-faee9da5a7cc.cfm

0 голосов
/ 26 сентября 2018

Вы можете попробовать это -

    var strZip = {};
    for ( i=1; i<=ZipResult.recordCount; i++)
    {
        strZip[ZipResult.RecID[i]] = {
             "City" : trim(ZipResult.City[i]),
             "State" : trim(ZipResult.State[i])
        };
    }

Таким образом, мы рассматриваем запрос как структуру массивов.

...