Могу ли я получить строку запроса по индексу в ColdFusion?

StackOverflow https://stackoverflow.com/questions/1212554

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

<cfset x = QueryName[5]>

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

Это было полезно?

Решение

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

<cfset x = QueryName.columnName[5]>

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

Другие советы

Теперь это можно выполнить в 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#" >

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

yourQueryName [Quot &, yourColumnName Quot &;] [ ROWNUMBER ]

<cfoutput>
     #mycontacts["Name"][13]#
     #mycontacts["HomePhone"][13]# 
</cfoutput>

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

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

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

Я знаю, что возвращаюсь к этой теме каждый раз, когда я Google " 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 позже, если вам придется его использовать.

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

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

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

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

Когда вы serializeJSON(variables.myquery) изменяете запрос на отформатированный в JSON объект структуры cfml с двумя элементами: " Columns " и " данные " ;. Оба из них являются массивами данных. & Quot; data & Quot; массив - это двумерный массив для строк, а затем столбчатых данных.

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

Предположим, у нас уже есть переменная запроса с именем '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] />

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

scroll top