【问题标题】:ColdFusion Component Not Returning QueryColdFusion 组件不返回查询
【发布时间】:2015-06-03 01:51:06
【问题描述】:

我断断续续地尝试了大约 6 个月左右的时间来弄清楚 CFC,但始终无法得到它。所以现在我有散布在不同页面中的 SQL 和 LDAP 查询,我想将它们整合到一个组件中。下面的查询在它自己的 CF 页面中工作,(我省略了帖子的一些查询详细信息)但我得到的是一个空白页面而不是任何结果。这是我的querys.cfc:

<cfcomponent>    
    <cffunction name="EmployeeQuery" access="public" returntype="query">    
       <cfargument name="EmployeeID" required="yes" type="string"> 

       <cfldap action = "query" 
             name = "EmployeeAdd"
             attributes = "distinguishedName, displayName"
             filter = "sAMAccountName=#Arguments.EmployeeID#" 
             start = ""        
             scope="SUBTREE"
             maxrows="1"
             server = ""
             username=""
             password=""
             separator=";" />    
       <cfreturn EmployeeAdd>    
    </cffunction>
</cfcomponent>

我有一个简单的输入表单,我在其中输入文本,单击提交,然后在我的操作页面上:

<cfif IsDefined("form.btnEmployeeAdd")>    
    <cfinvoke component="queries" 
         method="EmployeeQuery" 
         cfinvokeargument  
         name="EmployeeID" 
         value="#form.txtEmployeeID#">
    <h3>Confirm Employee Entered</h3>
    <cfoutput>#EmployeeAdd.displayName#</cfoutput>
</cfif>

我的结果是一个空白页,我什至没有得到h3 文本。如前所述,所有这些在 .cfm 页面中都可以正常工作,但是当我尝试将其放入 .cfc 时,它会使床变得糟糕。与这方面的所有文档一样,有很多不同的方法可以做到这一点,但我没有尝试过任何工作,所以我希望我能朝着正确的方向前进。

【问题讨论】:

  • 小步带来幸福。从更简单的事情开始,比如返回“hello world”。然后返回当前日期和时间。
  • 与您的问题无关,但不要忘记 VAR/LOCAL 作用域 all 函数局部变量,包括查询名称,即EmployeeAdd。否则,如果组件曾经存储在共享范围内,则可能会出现难以跟踪的线程问题。

标签: coldfusion cfc


【解决方案1】:

您的cfinvoke 缺少returnVariable

<cfinvoke component="queries" method="EmployeeQuery" returnVariable="EmployeeAdd">
  <cfinvokeargument  name="EmployeeID" value="#form.txtEmployeeID#">
</cfinvoke>
<h3>Confirm Employee Entered</h3>
<cfoutput>#EmployeeAdd.displayName#</cfoutput>

或者,如果您使用的是 CF10 或更高版本,则可以这样做而不是您的 cfinvoke

<cfset employeeAdd = new queries().EmployeeQuery(form.txtEmployeeID)>

【讨论】:

  • 感谢马特,我在发布后添加了 cfinvokeargument 名称,但它仍然不起作用。无论您的 工作如何,我们都在 CF11 上。但是我遇到了另一个问题。最初,我的根文件夹中有 querries.cfc 和 application.cfc,所以我将它移到了这个特定应用程序的根目录,它可以与您的 cfset 一起使用,但仍然无法与我的 cfinvoke 一起使用,但不用担心。我从我所读到的内容中认为,您可以将这些 cfc 放在根目录中,以便其他应用程序可以使用它们。是否需要将这些查询方法放在application.cfc中?
  • 可以引用new folder.path.queries()等文件夹结构
  • @toleolu - Pankaj 是正确的。 cfinvokeargument 不是属性。它是一个单独的标签,必须嵌套在 inside cfinvoke 中。所以你原来的语法(和上面的 cfinvoke 例子)是不正确的。
  • 抱歉花了这么长时间才恢复过来,像往常一样,我退出了这个项目来处理其他与服务器相关的问题,然后我需要一段时间才能恢复速度.再次感谢所有回复的人,我非常感谢我在这里得到的耐心和帮助。除了订购披萨,Stack Overflow 是网上最好的东西!!!
【解决方案2】:

查看调用 cfc 方法的代码,您似乎以错误的方式执行此操作。您已在 cfinvoke 中添加了 cfinvokeargument 作为属性。 cfinvokeargument 应该添加到 cfinvoke 正文中,而不是。正如@matt 建议的那样,您需要将returnvariable 属性添加到cfinvoke 以获取从该方法返回的结果。像这样。

<cfinvoke component="queries" method="EmployeeQuery" returnVariable="EmployeeAdd">
     <cfinvokeargument  name="EmployeeID" value="#form.txtEmployeeID#">
</cfinvoke>

也正如@matt 所建议的,如果您使用cf10 或更高版本,您可以使用new 来实例化cfc,然后使用. 表示法调用该方法。像这样。

<cfset employeeAdd = new queries().EmployeeQuery(form.txtEmployeeID)>

【讨论】:

  • 感谢 Pankaj 为我解决这个问题。因为我们在 CF 11,所以我选择了新的查询方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2011-09-21
  • 2015-02-06
相关资源
最近更新 更多