Coldfusion 在查询上循环时出现未定义变量错误

Coldfusion 在查询上循环时出现未定义变量错误,coldfusion,cfloop,Coldfusion,Cfloop,使用cfloop在查询上循环时出错 当我在查询中使用cfdump时(请注意,在循环内部),我可以很好地看到所有数据。但是,当我像通常在cfloop中那样尝试获取每个变量的值时,我会收到一条消息,表明它们未定义。然后,我更改了每个变量以专门引用查询,现在的问题是该变量在查询中未定义。代码如下: <cffunction name="writeCourses"> <cfargument name="recordset" required="yes" type="query">

使用
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>
这都是一句话:/

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

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

您的问题似乎是无法确定范围。以下是您的前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>


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

您的问题似乎是作用域失败。以下是您的前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>

区别在于对局部变量temp使用var关键字,并将参数范围添加到记录集变量。

(除了Dan的注释…)

如果[过程]找不到任何内容,它将返回一个包含 错误消息(即未找到课程)

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

另外,正如我在评论中提到的,您确实需要本地化函数变量
result
output
temp
,etectera。如果重用变量名,缺少
var
作用域可能会产生问题,即使在同一页面内也是如此。正如@Dan所建议的,您应该完全限定所有变量的作用域,尤其是函数
参数

(顺便说一句,我知道您正在修改现有代码,但错误消息确实应该在CF中处理,而不是在过程中处理。过程的任务只是返回数据。CF代码应该检查记录计数,如果没有找到记录,则应采取适当的措施。)

(除了Dan的注释……)

如果[过程]找不到任何内容,它将返回一个包含 错误消息(即未找到课程)

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

另外,正如我在评论中提到的,您确实需要本地化函数变量
result
output
temp
,etectera。如果重用变量名,缺少
var
作用域可能会产生问题,即使在同一页面内也是如此。正如@Dan所建议的,您应该完全限定所有变量的作用域,尤其是函数
参数


(顺便说一句,我知道您正在修改现有代码,但错误消息确实应该在CF中处理,而不是在过程中处理。过程的任务只是返回数据。CF代码应该检查记录计数,如果没有找到记录,则应采取适当的措施。)

您可以向我们展示
输出吗(或者至少有一部分显示记录集)?现在添加一些示例。错误也指向哪个变量和行?您能分享实际的错误消息吗?这里是第一部分:详细信息[空字符串]| ErrNumber 0 |消息元素COURSETYPE在记录集中未定义。| Resolvedname记录集|。如果我只是有
#COURSETYPE
而不是
#记录集。COURSETYPE#
我只是有一条消息说COURSETYPE未定义。@mAlenius:请编辑您的问题以包含此信息。注释是永久的nd,正如您所看到的,在格式化方面没有太多的考虑。您能给我们看一下
输出(或者至少其中一部分显示记录集)吗?现在添加一些示例。错误指向的变量和行是什么?您能分享实际的错误消息吗?这里是第一部分:详细信息[空字符串]| ErrNumber 0 |消息元素COURSETYPE在记录集中未定义。| Resolvedname记录集|。如果我只是有
#COURSETYPE
而不是
#记录集。COURSETYPE#
我只是有一条消息说COURSETYPE未定义。@mAlenius:请编辑您的问题以包含此信息。注释是永久的正如你所看到的,格式方面没有太多的考虑。这就成功了;谢谢:)我还为每个变量添加了isDefined检查,这可能也会有所帮助。@mAlenius不使用
isDefined()
使用
structKeyExists(structure,value)
而不是使用
structKeyExists(structure,value)
来代替这个方法;谢谢:)我还为每个变量添加了isDefined检查,这可能也会有所帮助。@mAlenius不使用
isDefined()
use
structKeyExists(structure,value)
;我一开始读错了。嗯。。这与您描述的错误不符;-)但很高兴它现在可以工作了。如果没有找到任何内容,存储过程只返回一个空查询;我一开始读错了。嗯。。这与您描述的错误不符;-)但很高兴它现在起作用了。