Подтвердить что ты не робот

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

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

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

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

<cfset x = QueryName[5]>

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

4b9b3361

Ответ 1

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

<cfset x = QueryName.columnName[5]>

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

Ответ 2

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

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

Надеюсь, это указывает на то, что вы в правильном направлении.

Ответ 3

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

<cffunction name="QueryGetRow" access="public" returntype="array" hint="I return the specified row 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

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

yourQueryName [ "yourColumnName" ] [ROWNUMBER]

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Когда вы serializeJSON(variables.myquery), он меняет запрос на JSON-форматированный объект struct cfml с двумя элементами: "Столбцы" и "Данные". Оба эти массива данных. Массив "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] />

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

Ответ 8

Ознакомьтесь с документацией для queryGetRow. Он принимает объект запроса и индекс строки, при этом первая строка ссылается на индекс 1 (NOT 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) />