هل يمكنني الحصول على صف استعلام حسب الفهرس في 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 في الإجابة .

نصائح أخرى

والآن يمكن تحقيق ذلك في كولد فيوجن 11 عبر <لأ href = "https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-mr/querygetrow.html" يختلط = "noreferrer" > 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 [ " yourColumnName "] [ 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>

وهذا الأمل النقاط التي في الاتجاه الصحيح.

وأنا أعلم أنني أعود لهذا الموضوع أي وقت I جوجل "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 [ "اسم العمود"] [rowNumber]) صحيحة، ولكن ليس مريحة للحصول على التوالي الكامل للبيانات الاستعلام.

وأنا على التوالي Railo 4.1. وهذا هو الحل بارد. جدا سيئة وهذا لا يمكن أن يتم في الطريقة التي تريد الصريح للحصول على التوالي كاملة من البيانات، ولكن الأسلوب التالي يتيح لنا أن نحصل على ما نريد من خلال بعض الأطواق.

عند serializeJSON(variables.myquery) يتغير الاستعلام إلى كائن البنية CFML JSON تنسيق مع اثنين من العناصر: "الأعمدة" و "البيانات". كل من هذه صفائف من البيانات. مجموعة "البيانات" هي مجموعة ثنائية الأبعاد الصفوف والبيانات ثم عمودية.

والمسألة هي أن لدينا الآن سلسلة غير صالحة للاستعمال. ثم إذا كان لنا أن إعادة تسلسل، انها ليست الاستعلام، ولكن البنية العادية التي يمكن استخدامها بدلا في تنسيق الموصوفة أعلاه.

وافترض لدينا بالفعل متغير الاستعلام اسمه 'variables.myquery. بعد ذلك ننظر في التعليمة البرمجية التالية:

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

والآن يمكنك الحصول على مجموعة واثنين من الأبعاد عن طريق الحصول على هذا:

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

وتحصل على واحد مجموعة الصف الاستعلام عن طريق الحصول على هذا:

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

وOR الصف الأخير بهذه الطريقة:

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

ويمكنك الحصول على قيم العمود الفردية عن طريق ترتيب الأعمدة عدد التكرار:

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

والآن هذا قد يكون بطيئا، وربما من الحكمة مع نتائج الاستعلام كبيرة، ولكن هذا هو الحل بارد مع ذلك.

تحقق من الوثائق ل 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) />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top