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()
usestructKeyExists(structure,value)
;我一开始读错了。嗯。。这与您描述的错误不符;-)但很高兴它现在可以工作了。如果没有找到任何内容,存储过程只返回一个空查询;我一开始读错了。嗯。。这与您描述的错误不符;-)但很高兴它现在起作用了。