toleolu
toleolu

Reputation: 77

ColdFusion Component Not Returning Query

I have tried, off and on, for about 6 months or so to figure out CFC's but never could get it. So now I have SQL and LDAP queries scattered around in different pages that I would like to consolidate into a component. The query below works in it's own CF page, (I've omitted some of the query details for the post) but I'm getting a blank page instead of any results. This is my queries.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>

I've got a simple entry form where I enter text, click submit, and on the action page I have:

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

My result is a blank page, I don't even get the h3 text. As mentioned, all this works fine in .cfm pages, but it craps the bed when I try to put it in a .cfc. As with all documentation on this, there's so many different ways to do this, but nothing I've tried works so I was hoping I could get a push in the right direction.

Upvotes: 0

Views: 501

Answers (2)

Matt Busche
Matt Busche

Reputation: 14333

Your cfinvoke is missing a returnVariable

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

Alternatively if you're on CF10 or higher you could do this instead of your cfinvoke

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

Upvotes: 2

Pankaj
Pankaj

Reputation: 1741

Looking at your code to invoke the cfc method, it seems like you are doing it in a wrong way. You have added cfinvokeargument inside cfinvoke as an attribute. cfinvokeargument should be added to cfinvoke body, instead. And as @matt suggested you need to add returnvariable attribute to cfinvoke in order to get results returned from the method. Like this.

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

Also as @matt suggested, if you are using cf10 or higher you can use new to instantiate the cfc and then call the method using . notation. Like this.

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

Upvotes: 2

Related Questions