1

使用cfloop.

当我cfdump在查询上使用 a 时(请注意,在循环内),我可以很好地看到所有数据。但是,当我像往常一样尝试获取每个变量的值时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.但它们仍然是未定义的。当我取消注释cfdumpandcfabort标记时,它们工作正常,我可以看到recordset所有数据的查询。

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

recordset这是转储的示例:

在此处输入图像描述

错误消息:
详细信息:[空字符串]
ErrNumber:0
消息:元素 COURSETYPE 在 RECORDSET 中未定义。
已解决名称: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>
4

2 回答 2

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>

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

于 2013-04-16T22:55:26.760 回答
0

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

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

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

此外,正如我在评论中提到的,您确实需要本地化函数变量result、、、outputtempvar如果您重用变量名称,即使在同一页面内,缺少范围也会产生问题。正如@Dan 建议的那样,您应该完全限定所有变量 - 特别是 function arguments

(顺便说一句,我知道您正在修改现有代码,但错误消息实际上应该在 CF 中处理,而不是在程序内部。程序的工作只是返回数据。CF 代码应该检查 recordCount 并采取适当的措施如果没有找到记录。)

于 2013-04-17T02:35:44.243 回答