Вывод cfquery ColdFusion 2016 приводит к массиву структур?

У меня есть запрос с несколькими строками записей. Я хотел бы вывести каждую строку в структуре с ключом имени столбца. После перебора записей запроса я хочу установить эту структуру в массив. Пока у меня правильный формат моих данных, но по какой-то причине каждая строка данных одинакова. Кажется, что все данные поступают из одной строки. Вот пример моего кода:

<cfset strGraphData = StructNew()>
<cfset arrGraphData = arrayNew(1)>

<cfquery name="getGraphData" datasource="myDB">
    SELECT gr_date, gr_LabelA,  gr_LabelB
    FROM GraphData WITH (NOLOCK)
    WHERE gr_ID = <cfqueryparam value="#arguments.graphID#" cfsqltype="cf_sql_integer">
    ORDER BY gr_date ASC
</cfquery>

<cfoutput query="getGraphData">
    <cfloop list="#getGraphData.getColumnNames()#" index="columnName">
        <cfset strGraphData[columnName] = Trim(getGraphData[columnName][getGraphData.CurrentRow])>
    </cfloop>
    <cfset arrayAppend(arrGraphData, strGraphData)>
</cfoutput>

Если я попытаюсь сбросить массив, вот как выглядит мой вывод:

array
1   
struct
GR_DATE 2014-05-12 00:00:00.0
GR_LABELA   17
GR_LABELB   [empty string]

2   
struct
GR_DATE 2014-05-12 00:00:00.0
GR_LABELA   17
GR_LABELB   [empty string]

3   
struct
GR_DATE 2014-05-12 00:00:00.0
GR_LABELA   17
GR_LABELB   [empty string]

4   
struct
GR_DATE 2014-05-12 00:00:00.0
GR_LABELA   17
GR_LABELB   [empty string]

5   
struct
GR_DATE 2014-05-12 00:00:00.0
GR_LABELA   17
GR_LABELB   [empty string]

6   
struct
GR_DATE 2014-05-12 00:00:00.0
GR_LABELA   17
GR_LABELB   [empty string]

7   
struct
GR_DATE 2014-05-12 00:00:00.0
GR_LABELA   17
GR_LABELB   [empty string]

8   
struct
GR_DATE 2014-05-12 00:00:00.0
GR_LABELA   17
GR_LABELB   [empty string]

9   
struct
GR_DATE 2014-05-12 00:00:00.0
GR_LABELA   17
GR_LABELB   [empty string]

Вот пример фактического запроса данных:

GR_DATE
2014-01-14 00:00:00.000
2014-02-04 00:00:00.000
2014-02-18 00:00:00.000
2014-03-04 00:00:00.000
2014-03-18 00:00:00.000
2014-04-01 00:00:00.000
2014-04-15 00:00:00.000
2014-04-29 00:00:00.000
2014-05-12 00:00:00.000

GR_LABELA
1
3
5
5
10
16
16
16
17

GR_LABELB
    NULL
    NULL
    NULL
    NULL
    NULL
    NULL
    NULL
    NULL

Как видите, данные в массиве структур повторяют данные из последней строки. Я не уверен, где ошибка в моем коде. Если кто-нибудь знает, как решить эту проблему, пожалуйста, дайте мне знать. Спасибо.


person espresso_coffee    schedule 07.02.2018    source источник
comment
Просто примечание: NOLOCK может не делать того, что вы думаете. Это позволит вашему запросу прочитать другой процесс блокировки, но это грязное чтение (то же, что и READ UNCOMMITTED): это означает, что ваш запрос может вернуть x=1, но затем процесс блокировки откатывается и теперь x=42 в базе данных. Если все в порядке, то придерживайтесь подсказки NOLOCK, иначе смотрите на уровни изоляции транзакций. Я также считаю, что синтаксис сценария намного чище для зацикливания, но это почти религиозный спор.   -  person Shawn    schedule 07.02.2018


Ответы (1)


Проблема в том, что код создает только одну структуру. Таким образом, все эти циклы обновляют эту структуру и снова и снова добавляют одну и ту же структуру к массиву.

Чтобы заполнить массив отдельными структурами, вы должны создать структуру new перед внутренним циклом:

<cfoutput query="getGraphData">
    <!--- create new structure here --->
    <cfset strGraphData = StructNew()>

    <cfloop list="#getGraphData.getColumnNames()#" index="columnName">
        <cfset strGraphData[columnName] = Trim(getGraphData[columnName][getGraphData.CurrentRow])>
    </cfloop>

    <cfset arrayAppend(arrGraphData, strGraphData)>
</cfoutput>
person SOS    schedule 07.02.2018
comment
@Agex Я понял, что структура может иметь только один уникальный ключ, и мой код устанавливал одни и те же ключи снова и снова. Спасибо за вашу помощь. - person espresso_coffee; 07.02.2018
comment
@espresso_coffee — вместо этого можно было бы рассмотреть возможность использования массивов и синтаксиса быстрого доступа к структуре. Они немного короче. - person SOS; 07.02.2018
comment
Есть более новые возможности для работы с массивами вместо списков, такие как ArrayEach() и т. д. Результат тот же, но синтаксис более гладкий. - person SOS; 07.02.2018