使用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.
进行,但它们仍未定义。当我取消注释cfdump
和cfabort
代码时,这些代码工作正常,我可以查看recordset
查询,其中包含所有数据。
我每次使用cfloop
查询时都会按预期工作。另外,我没有写这段代码,我不得不修改它(原作者不再在这里工作)。
以下是recordset
转储的示例:
错误讯息:
细节:[空字符串]
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>
答案 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
块内的代码都将执行。由于第一行代码使用该列,而不验证它是否存在,因此会导致您看到的确切错误。
另外,正如我在评论中提到的,你真的需要本地化函数变量result
,output
,temp
,etectera。如果重用变量名,即使在同一页面内,缺少var
作用域也会产生问题。正如@Dan建议你应该完全限制所有变量 - 特别是函数arguments
。
(顺便说一句,我知道你正在修改现有的代码,但错误信息应该在CF中处理,不是在程序中。程序的工作就是返回数据.CF如果没有找到记录,代码应检查recordCount并采取适当的操作。)