循环查询时未定义变量出错

时间:2013-04-16 19:43:03

标签: coldfusion cfloop

使用cfloop循环查询时出错。

当我在查询中使用cfdump时(请注意循环内),我可以很好地看到所有数据。但是,当我尝试像cfloop中通常那样获取每个变量的值时,我会收到一条消息,指出它们未定义。然后我更改了每个变量以专门引用查询,现在问题是查询中的变量未定义。这是代码:

<cffunction name="writeCourses">
<cfargument name="recordset" required="yes" type="query">
     <cfif recordset.RecordCount NEQ 0>
         <cfset temp = "">  
         <cfoutput>
         <cfloop query="recordset">     
         <!--- <cfdump var="#recordset#"> <cfabort/> --->  

            <cfset temp = temp & "<strong>#recordset.courseType# #recordset.courseNum# ">
            <cfif isDefined("recordset.courseTHM") AND recordset.courseTHM EQ 1>
                <cfset temp = temp & "(#left(recordset.courseNum,3)#4) ">
            </cfif>
            <cfif isDefined("recordset.courseName")>
                <cfset temp = temp & "#recordset.courseName# </strong><br>">
            </cfif>
            <cfset temp = temp & "#recordset.courseDESC#<br>">
            <cfset temp = temp & "#recordset.courseHours#<br><br>">
        </cfloop>
        </cfoutput>
     <cfelse>
        <cfset temp = "">
     </cfif>
 <cfreturn temp>
</cffunction>

如您所见,每个变量都包含在##标记中。最初它们都没有由recordset.进行,但它们仍未定义。当我取消注释cfdumpcfabort代码时,这些代码工作正常,我可以查看recordset查询,其中包含所有数据。

我每次使用cfloop查询时都会按预期工作。另外,我没有写这段代码,我不得不修改它(原作者不再在这里工作)。

以下是recordset转储的示例:

enter image description here

错误讯息:
细节:[空字符串]
ErrNumber:0
消息:RECORDSET中未定义元素COURSETYPE 已解决名称:RECORDSET

错误行是:

   <cfset temp = temp & "<strong>#recordset.courseType# #recordset.courseNum# ">   
   <cfif isDefined("recordset.courseTHM") AND recordset.courseTHM EQ 1>
   <cfset temp = temp & "(#left(recordset.courseNum,3)#4) ">
   </cfif>
   <cfif isDefined("recordset.courseName")>
   <cfset temp = temp & "#recordset.courseName# </strong><br>">
   </cfif>

这就是一行:/

调用上述内容的存储过程/函数:

<cffunction name="getCoursesByDept">
<cfargument name="deptCode" required="yes" type="string">
<CFSTOREDPROC procedure="dbo.GetCourses"     datasource="WebCatalog">
    <CFPROCPARAM type="IN" dbvarname="@deptCode" value="#deptCode#" cfsqltype="CF_SQL_CHAR">
    <CFPROCRESULT name="result">
</CFSTOREDPROC>
<cfinvoke method="writeCourses" recordset="#result#" returnvariable="output">
<cfreturn output>
</cffunction>

2 个答案:

答案 0 :(得分:1)

您的问题似乎无法扩大范围。以下是您的前4行:

<cffunction name="writeCourses">
<cfargument name="recordset" required="yes" type="query">
 <cfif recordset.RecordCount NEQ 0>
     <cfset temp = "">  

试试这样:

<cffunction name="writeCourses">
<cfargument name="recordset" required="yes" type="query">
<cfset var temp = "">  
<cfif arguments.recordset.RecordCount NEQ 0>

不同之处在于使用var关键字作为局部变量temp,并将参数scope添加到记录集变量中。

答案 1 :(得分:0)

(除了Dan的评论......)

  

如果[程序]找不到任何内容,则返回包含的查询   错误信息(即没有找到课程)

然后,这意味着COURSETYPE列并不总是存在于resultset中,这正是错误消息所报告的内容。如果该过程返回任何结果,则无论内容如何,​​cfif块内的代码都将执行。由于第一行代码使用该列,而不验证它是否存在,因此会导致您看到的确切错误。

另外,正如我在评论中提到的,你真的需要本地化函数变量resultoutputtemp,etectera。如果重用变量名,即使在同一页面内,缺少var作用域也会产生问题。正如@Dan建议你应该完全限制所有变量 - 特别是函数arguments

(顺便说一句,我知道你正在修改现有的代码,但错误信息应该在CF中处理,不是在程序中。程序的工作就是返回数据.CF如果没有找到记录,代码应检查recordCount并采取适当的操作。)