2009-07-31 3 views
32

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

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

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

<cfset x = QueryName[5]> 

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

+1

CFLib.org на помощь еще раз: http://cflib.org/udf/queryGetRow. Это позволит вам выполнить '' – ale

ответ

60

Вы не можете получить строку в CF < = 10. Вам нужно получить конкретную колонку.

<cfset x = QueryName.columnName[5]> 

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

+0

Спасибо, вот что я искал. –

+8

Я предпочитаю обозначение скобок для строк и столбцов, но в любом случае это справедливо. QueryName [ "ColumnName"] [5]. Вам понадобится запись в виде скобок, если вы хотите, например, использовать переменную для имени столбца. – ale

+2

Неправда. Вы можете получить строку, просто не используя стандартные CF API. И вы не сможете получить доступ к столбцам напрямую по именам переменных - вам нужно знать индекс. Вы можете сделать myquery.getRow (0), чтобы получить первый «coldfusion.sql.imq.Row» и myrow.getColumn (0), чтобы получить первый столбец. Строка также имеет метод получения объекта [], представляющего всю строку. – Mark

7

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

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

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

+0

Я думал, что это был единственный способ сделать это, пока я не увидел ответ Патрика – Kip

6

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

<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

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

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

. Также есть CFLIB: http://cflib.org/udf/queryGetRow – ale

+0

Thanx! Я не знал о cflib – YZE91

6

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

yourQueryName [ "yourColumnName "] [RowNumber]

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

метода, описанная выше для получения данных запроса по имени столбца и номер строки (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] /> 

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

7

Это теперь может быть достигнуто в 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

Ответ Killer. Мне стыдно сказать, что я не знал об этой функции. cf11 продолжает поставлять! – jyoseph

+0

@jyoseph Теперь, если только они могут отслеживать, как lucee, и добавить «lazy =» true »в тег cfquery, чтобы я мог вытащить тысячи строк, не беспокоясь о том, что Coldfusion пытается съесть всю память. – FrankerZ

-1

Отъезд документации 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) />