Могу ли я получить строку запроса по индексу в ColdFusion? - PullRequest
35 голосов
/ 31 июля 2009

Я хочу получить определенную строку в объекте запроса ColdFusion, не зацикливаясь на нем.

Я бы хотел сделать что-то вроде этого:

<cfquery name="QueryName" datasource="ds">
SELECT *
FROM    tablename
</cfquery>

<cfset x = QueryName[5]>

Но это дает мне ошибку, говоря, что запрос не индексируется "5". Я точно знаю, что в этом запросе более 5 записей.

Ответы [ 8 ]

64 голосов
/ 31 июля 2009

Вы не можете получить строку в CF <= 10. Вы должны получить определенный столбец. </p>

<cfset x = QueryName.columnName[5]>

Прошло уже 8 лет с тех пор, как я опубликовал этот ответ. Очевидно CF11 наконец-то реализовал эту функцию. См. ответ FrankieZ .

11 голосов
/ 10 февраля 2016

Теперь это можно выполнить в Coldfusion 11 через QueryGetRow

<cfquery name="myQuery" result="myresult" datasource="artGallery" fetchclientinfo="yes" >
select * from art where ARTID >
<cfqueryparam value="2" cfsqltype="CF_SQL_INTEGER">
</cfquery>

<cfdump var="#myQuery#" >

<cfset data = QueryGetRow(myQuery, 1) >

<cfdump var="#data#" >
7 голосов
/ 10 мая 2013

Я думаю, что есть более простое решение ... Я предполагаю, что вы знаете имена своих столбцов и хотите только этот столбец или тот. Тогда вам не нужно помещать всю строку в структуру. Вы можете ссылаться на запрос по номеру строки (запомните его 1 на основе, а не 0).

yourQueryName [ " yourColumnName "] [ ROWNUMBER ]

<cfoutput>
     #mycontacts["Name"][13]#
     #mycontacts["HomePhone"][13]# 
</cfoutput>
7 голосов
/ 31 июля 2009

Вы должны сначала преобразовать запрос в структуру:

<cfscript>
    function GetQueryRow(query, rowNumber) {
        var i = 0;
        var rowData = StructNew();
        var cols = ListToArray(query.columnList);
        for (i = 1; i lte ArrayLen(cols); i = i + 1) {
            rowData[cols[i]] = query[cols[i]][rowNumber];
        }
        return rowData;
    }
</cfscript>

<cfoutput query="yourQuery">
    <cfset theCurrentRow = GetQueryRow(yourQuery, currentRow)>
    <cfdump var="#theCurrentRow#">
</cfoutput>

Надеюсь, это направит вас в правильном направлении.

6 голосов
/ 03 августа 2011

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

<cffunction name="QueryGetRow" access="public" returntype="array" hint="I return the specified row's data as an array in the correct order">
    <cfargument name="query" required="true" type="query" hint="I am the query whose row data you want">
    <cfargument name="rowNumber" required="true" hint="This is the row number of the row whose data you want">

    <cfset returnArray = []>
    <cfset valueArray = []>

    <cfset cList = ListToArray(query.ColumnList)>
    <cfloop from="1" to="#ArrayLen(cList)#" index="i">
        <cfset row = query["#cList[i]#"][rowNumber]>
        <cfset row = REReplace(row, "(,)", " ")>
        <cfset returnArray[i] = row>
        <cfset i++>
    </cfloop>   
    <cfreturn returnArray>
</cffunction>

REReplace является необязательным, он у меня там, чтобы очистить запятые, чтобы он не испортил функцию arrayToList позже, если вам придется его использовать.

4 голосов
/ 27 января 2012

Я хотел извлечь одну строку из запроса и сохранить имена столбцов (конечно). Вот как я это решил:

<cffunction name="getQueryRow" returntype="query" output="no">
    <cfargument name="qry" type="query" required="yes">
    <cfargument name="row" type="numeric" required="yes">
    <cfset arguments.qryRow=QueryNew(arguments.qry.columnlist)>
    <cfset QueryAddRow(arguments.qryRow)>
    <cfloop list="#arguments.qry.columnlist#" index="arguments.column">
        <cfset QuerySetCell(arguments.qryRow,arguments.column,Evaluate("arguments.qry.#arguments.column#[arguments.row]"))>
    </cfloop>
    <cfreturn arguments.qryRow>
</cffunction>
1 голос
/ 03 марта 2017

Ознакомьтесь с документацией для queryGetRow . Он принимает объект запроса и индекс строки с ссылкой на первую строку с индексом 1 (НЕ 0). Индекс, используемый таким образом, должен быть положительным целым числом.

<cfquery name="QueryName" datasource="ds">
  SELECT *
  FROM tablename
</cfquery>

<!---
    This would retrieve the first record of the query
    and store the record in a struct format in the variable 'x'.
--->
<cfset x = queryGetRow(QueryName, 1) />
<!---
    This is an alternative using the member method form of queryGetRow
--->
<cfset x = QueryName.getRow(1) />
1 голос
/ 08 октября 2013

Методы, ранее описанные для получения данных запроса по имени столбца и номеру строки (variables.myquery ["columnName"] [rowNumber]), являются правильными, но не удобны для получения полной строки данных запроса.

Я использую Railo 4.1. И это классное решение. Жаль, что это нельзя сделать так, как мы бы хотели, чтобы сразу получить полный ряд данных, но следующий метод позволяет нам получить то, что мы хотим, через несколько обручей.

Когда вы serializeJSON(variables.myquery), он изменяет запрос на объект структуры cfml в формате JSON с двумя элементами: «Столбцы» и «Данные». Оба из них являются массивами данных. Массив «data» - это двумерный массив для строк, а затем столбцовых данных.

Проблема в том, что теперь у нас есть неиспользуемая строка. Затем, если мы повторно сериализуем его, это НЕ запрос, а скорее используемая регулярная структура в формате, описанном выше.

Предположим, у нас уже есть переменная запроса с именем 'variables.myquery'. Затем посмотрите на следующий код:

<cfset variables.myqueryobj = deserializeJSON(serializeJSON(variables.myquery)) />

Теперь вы получите двумерный массив, получив:

<cfset variables.allrowsarray = variables.myqueryobj.data />

И вы получите один массив строк запроса, получив:

<cfset variables.allrowsarray = variables.myqueryobj.data[1] />

ИЛИ последний ряд таким образом:

<cfset variables.allrowsarray = variables.myqueryobj.data[variables.myquery.recordCount] />

И вы можете получить отдельные значения столбца по итерации номера заказа столбца:

<cfset variables.allrowsarray = variables.myqueryobj.data[1][1] />

Теперь это может быть медленно и, возможно, неразумно с большими результатами запросов, но, тем не менее, это крутое решение.

...