Ich versuche, einige Seiten von meiner Anwendung zu cfc zu konvertieren, und eine Seite verwendet eine gespeicherte Prozedur, um ein paar Datensätze abzurufen.Rückgabe mehrerer Ergebnisprozesssätze gespeicherter Prozeduren von einem cfc
Jetzt, wenn ich auf die Ergebnisse zugreifen, verhalten sie sich wie ein, wenn ich ein <cfquery>
-Tag verwendet, und all die Funktionalität, die gibt. Jetzt versuche ich, dieselbe gespeicherte Prozedur in einem cfc zu verwenden, den ich gerade erstelle, und ich möchte auf die gleiche Weise auf die Ergebnisse zugreifen können, und da liegt mein Problem. Ich bin mir nicht sicher, wie mehrere Abfragen von der Funktion zurückgegeben werden, ohne ein Array zu erstellen, das ich gestartet habe. Die Funktion ist übrigens unvollständig. Ich habe nur versucht, etwas zur Arbeit zu bringen. Im folgenden Setup bekomme ich ein Array von Abfrageobjekten, aber ich denke, es gibt einen besseren Weg, dies zu tun. Hier
ist die <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>
Wenn ich Ausgabe einige Testdaten, es passt bis
<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>
ich:
Von cfc (#count [1]. recordCount #): 1
Von gespeicherten Proc (# profile_head.recordCount #): 1
Aber der zweite Weg sieht so viel sauberer aus.
-----------------------------WORKING SOLUTION------------------------------
Also nach der Arbeit mit der Antwort von @leigh, kam ich mit diesem. Hier
ist die volle 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>
Hier ist der Code von der rufenden Seite:
<cfset fund_profile = CreateObject("component", "CFCs.fund_profile").init("#dsn#","#cusip#","#report_date#")>
<cfset profile_head = fund_profile.getProfileHead()>
Sorry für den gesamten Code, aber ich wollte den Code zur Verfügung stellen. Also sieht irgendjemand irgendwelche Probleme mit dem, was mir eingefallen ist?
Dies scheint nicht so gut. Jedes Mal, wenn Sie Daten wollen, müssen Sie 'getProfileData' ausführen, um die gespeicherte Prozedur auszuführen, und dann eine andere 'get'-Methode ausführen, um die aktualisierten Informationen zu erhalten. Ist das effizient? –