У меня есть запрос с несколькими строками записей. Я хотел бы вывести каждую строку в структуре с ключом имени столбца. После перебора записей запроса я хочу установить эту структуру в массив. Пока у меня правильный формат моих данных, но по какой-то причине каждая строка данных одинакова. Кажется, что все данные поступают из одной строки. Вот пример моего кода:
<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
Как видите, данные в массиве структур повторяют данные из последней строки. Я не уверен, где ошибка в моем коде. Если кто-нибудь знает, как решить эту проблему, пожалуйста, дайте мне знать. Спасибо.
NOLOCK
может не делать того, что вы думаете. Это позволит вашему запросу прочитать другой процесс блокировки, но это грязное чтение (то же, что иREAD UNCOMMITTED
): это означает, что ваш запрос может вернутьx=1
, но затем процесс блокировки откатывается и теперьx=42
в базе данных. Если все в порядке, то придерживайтесь подсказкиNOLOCK
, иначе смотрите на уровни изоляции транзакций. Я также считаю, что синтаксис сценария намного чище для зацикливания, но это почти религиозный спор. - person Shawn   schedule 07.02.2018