【问题标题】:returning multiple stored procedure result sets from a cfc从 cfc 返回多个存储过程结果集
【发布时间】:2012-04-02 19:53:26
【问题描述】:

我正在尝试将我的应用程序中的一些页面转换为使用 cfc,其中一个页面使用存储过程来检索几组数据。

现在,当我访问结果时,它们的行为就像我使用 <cfquery> 标记以及提供的所有功能一样。所以现在我试图在我正在构建的 cfc 中使用相同的存储过程,并且我希望能够以相同的方式访问结果,这就是我的问题。我不确定如何从函数返回多个查询,而不创建我已经开始的数组。顺便说一句,功能不完整。我只是想让一些东西工作。在下面的设置中,我得到了一组查询对象,但我觉得有更好的方法。

这里是<cffuntion>

<cffunction name="getProfileData" 
            access="public" 
            output="false" 
            returntype="string">

    <cfargument name="cusip" type="string" required="true">
    <cfargument name="report_date" type="date" required="true">
    <cfset var errorMessage = "everything is good">

    <cftry>
        <cfstoredproc datasource="#dsn#" procedure="prc_asset_profile_retrieve">
            <cfprocparam type="in" cfsqltype="cf_sql_varchar" value="#cusip#" dbvarname="@cusip">
            <cfprocparam type="in" cfsqltype="cf_sql_varchar" value="#report_date#" dbvarname="@reportDate">
            <cfprocresult name="profile_head" resultset="1">
            <cfprocresult name="attribution" resultset="2">
            <cfprocresult name="characteristics" resultset="3">
            <cfprocresult name="exposure" resultset="4">
            <cfprocresult name="weights" resultset="5">
            <cfprocresult name="holdings" resultset="6">
        </cfstoredproc>

        <cfset var profileArray = []>
        <cfset #ArrayAppend(profileArray,profile_head)#>

        <cfcatch type="any">
            <cfset errorMessage = "something happened">
        </cfcatch>          
    </cftry>

    <cfreturn profileArray>
</cffunction>

当我输出一些测试数据时,它匹配了

<cfset count = fund_profile.getProfileData("#cusip#","#report_date#")> 
<cfdump var="#count[1]#">
<cfoutput>
    From cfc (##count[1].recordCount##): #count[1].recordCount#<br>
    From stored proc (##profile_head.recordCount##): #profile_head.recordCount#
</cfoutput>

我明白了:

来自 cfc (#count[1].recordCount#):1
从存储过程(#profile_head.recordCount#):1

但第二种方式看起来更干净。

   -----------------------------WORKING SOLUTION------------------------------ 

所以在处理了@leigh 的答案后,我想出了这个。

这是完整的cfc:

<cfcomponent displayname="Fund Profile" hint="This is the cfc that will do the processing of all fund profile information" output="false">
     <cfproperty name = "result1"> <!--- PROFILE HEAD --->
     <cfproperty name = "result2"> <!--- ATTRIBUTION --->
     <cfproperty name = "result3"> <!--- CHARACTERISTICS --->
     <cfproperty name = "result4"> <!--- EXPOSURE --->
     <cfproperty name = "result5"> <!--- WEIGHTS --->
     <cfproperty name = "result6"> <!--- HOLDINGS --->

     <cffunction name="init" 
            displayname="init" 
            hint="This will initialize the object" 
            access="public" 
            output="false" 
            returnType="Any">

        <cfargument name="dsn"  type="string" required="true" />
        <cfargument name="cusip" type="string" required="true" />
        <cfargument name="report_date" type="date" required="true" />

        <cfset variables.dsn = #arguments.dsn#>
        <cfset variables.cusip = #arguments.cusip#>
        <cfset variables.report_date = #arguments.report_date#>

        <cfscript>
            getProfiledata(cusip,report_date);
        </cfscript>     

        <cfreturn this>
    </cffunction>

    <cffunction name="getProfileData" 
            access="private" 
            output="false" 
            returntype="void">

        <cfargument name="cusip" type="string" required="true">
        <cfargument name="report_date" type="date" required="true">

        <cfstoredproc datasource="#dsn#" procedure="prc_asset_profile_retrieve">
             <!--- STORED PROCEDURE HASN'T CHANGED.  SEE ABOVE FOR CODE --->
        </cfstoredproc>

        <cfscript>
            setProfilehead(profile_head);
            setAttribution(attribution);
            setCharacteristics(characteristics);
            setExposure(exposure);
            setWeights(weights);
            setHoldings(holdings);
        </cfscript>

        <cfreturn>
    </cffunction>

    <!--- NOT GOING TO INCLUDE ALL SETTERS AND GETTERS, --->
    <!--- BECAUSE THEY ARE ALL THE SAME OTHER THAN THE NAMES --->

    <cffunction name="setProfileHead" access="private">
        <cfargument name="ProfileHead">
        <cfset variables.result1 = arguments.ProfileHead>       
    </cffunction>

    <cffunction name="getProfileHead" access="public" returntype="query">
        <cfreturn variables.result1>
    </cffunction>

</cfcomponent>

这是调用页面的代码:

<cfset fund_profile = CreateObject("component", "CFCs.fund_profile").init("#dsn#","#cusip#","#report_date#")>
<cfset profile_head = fund_profile.getProfileHead()>

抱歉所有代码,但我想让代码可用。那么有人发现我的想法有什么问题吗?

【问题讨论】:

  • 这似乎不太好。每次想要数据时,都必须运行getProfileData 来执行存储过程,然后再运行另一个get 方法来获取更新的信息。这有效率吗?

标签: coldfusion cfc


【解决方案1】:

一个函数只能返回一个值。如果您希望返回多个值,则需要使用某种类型的复杂对象(数组、结构......)如果数组不够直观,您可以将查询放在结构中并返回。然后调用页面可以通过名称而不是索引来访问查询。

(旁注,确保正确地 var 作用域/本地化所有函数变量。)

 <cfset var data = {}>
 ...
 <!--- store query results in structure --->
 <cfset data.profile_head = profile_head>
 <cfset data.attribution = attribution>
 ... 
 <cfset data.holdings = holdings>
 <!--- return structure --->
 <cfreturn data>

【讨论】:

  • 您可以使用 bean 方法并为每个结果集设置一个“get”(其中每个结果将是组件的“属性”).. 然后您将拥有 #objProfile.getprofileHead ()# 它将返回结果集,就像它是 proc 结果集的“名称”一样。这就是吉姆的建议。但是,为了方便您从习惯过渡到现在,我怀疑 Leigh 的方法更适合您。
  • 是的,我不确定他的设置,所以我采用了通用方法。但是豆类也是一个很好的方法。 (编辑:我知道我误读了吉姆的建议。对不起,@吉姆。+1 :)
  • 我想我会尝试两种方法。之前用过setter/getter类型结构,所以对概念比较熟悉。我会试一试,看看我更喜欢哪一个。
【解决方案2】:

我将在 CFC 中创建其他方法,每个方法都负责从存储的过程中返回结果。在 main 方法中,调用 setter setProfileHead(profilehead:profileHead)

<cffunction name=ProfileHead>
    <cfarguments name=ProfileHead />
    <cfset variables.profilehead = arguments.profilehead>
 </cffunction>

那么……

<cffunction name=GetProfileHead>
    <cfreturn variables.profileHead />
</cffuction>

【讨论】:

  • 所以,我有点困惑。当您说“主要方法”时,您的意思是我原始帖子中包含实际存储过程的那个?还是您的意思是调用 cfc 的 cfm 页面?
  • 我昨天发布了。如果您查看我今天编辑的原始帖子,您会看到我做了什么。
  • variables 作用域是 CFC 私有的,所以调用页面根本看不到它,这将如何工作
  • 调用页面会看到它,如果它调用 getProfileHead 因为那是它返回的内容。
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2011-03-20
  • 2016-08-06
  • 2012-07-19
相关资源
最近更新 更多