2017-06-28 52 views
2

我正在構建一個網頁,在webform提交後將進行AJAX調用。 AJAX然後調用一個cfc,其中有一個函數調用一個SQL存儲過程,將webform值作爲輸入參數傳遞。直到這裏沒問題,但是我對如何將數據返回給調用AJAX函數感到困惑 - 當存儲過程返回多個結果集時。將多個cfquery結果返回給AJAX調用

爲了更清楚一點,存儲過程內部有許多SELECT事務,並且它們中的每一個都作爲cfstoredproc中cfprocresult的一部分被捕獲。如果只有一個cfprocresult,將它傳遞迴AJAX看起來很簡單,但是如何將多個cfprocresult結果發送回調用的AJAX函數?

下面

僞代碼:

AJAX: ---------

$.ajax(

     { 

      type: 「post」, 

      url: "Contacts.cfc", 

      data: { 

       method: "retrieveCustomers", 

       username: this.DOMReferences.Name.val(), 



       }, 

      dataType: "json", 





      success: function(objResponse){ 



       if (objResponse.SUCCESS){ 



// rest of AJAX to process returned data here 

Contacts.cfc ---------

<cfcomponent> 
<cffunction name="retrieveCustomers" returntype="query"> 

<cfstoredproc datasource="#application.dsn_spoon#" procedure="proc_getUsers_paged"> 
      <cfprocparam cfsqltype="cf_sql_varchar" value="#username#"> 
      <cfprocresult name="qResult1" resultset="1"> 
      <cfprocresult name="qResult2" resultset="2"> 
      <cfprocresult name="qResult3" resultset="3"> 
</cfstoredproc> 


// how do i return all 3 result sets back to calling AJAX function? 

</cffunction> 
</cfcomponent> 

注意:我很少控制更改存儲過程邏輯。現有網頁在調用cfstoredproc組件時正在使用頁面本身的刷新,而不是使用AJAX。我正在改寫UI來代替使用AJAX。

謝謝!

+1

我認爲你可以做的是創建一個結構並將結果集存儲在其中。然後使用SerializeJSON函數將結構轉換爲JSON並將其作爲響應返回給Ajax。一旦你獲得了Ajax響應,你需要做的就是進一步解析和處理它。 –

+1

另外,如果你使用ajax直接調用你的CFC函數,那麼你需要設置access = remote並設置returntype = JSON –

+1

@Keshavjha - 謝謝。我想我現在理解這種方法。將在某個時候嘗試! – maverick

回答

1

你可以嘗試這樣的事:

<cfcomponent> 
<cffunction name="retrieveCustomers" returntype="struct" returnformat="json" access="remote"> 

<cfstoredproc datasource="#application.dsn_spoon#" procedure="proc_getUsers_paged"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="#username#"> 
     <cfprocresult name="qResult1" resultset="1"> 
     <cfprocresult name="qResult2" resultset="2"> 
     <cfprocresult name="qResult3" resultset="3"> 
</cfstoredproc> 

<cfset _results = structNew()> 
<cfset _results.result1 = qResult1> 
<cfset _results.result2 = qResult2> 
<cfset _results.result3 = qResult3> 

<cfreturn _results> 


</cffunction> 
</cfcomponent> 

這裏需要說明的是,你可能需要按摩qResults。通常,我會遍歷每個查詢並構建一個數組。但這只是個人喜好。我通常在返回查詢時做的是循環它並構建一個新的結構。這是因爲我可能想對每個屬性執行添加操作。

... 
<cfset _results = structNew()> 
<cfset _results.result1 = arrayNew()> 
<cfset _results.result2 = arrayNew()> 
<cfset _results.result3 = arrayNew()> 

<cfloop query="qResult1"> 
    <cfset _result = structNew()> 
    <cfset _result.col1 = qResult1.col1> 
    <cfset _result.col2 = qResult1.col2> 
    <cfset _result.col3 = qResult1.col3> 
    <cfset arrayAppend(_results.result1,_result)> 
</cfloop> 

<cfloop query="qResult2"> 
    <cfset _result = structNew()> 
    <cfset _result.cola = qResult2.cola> 
    <cfset _result.colb = qResult2.colb> 
    <cfset _result.colc = qResult2.colc> 
    <cfset _result.cold = qResult3.cold> 
    <cfset arrayAppend(_results.result2,_result)> 
</cfloop> 

<cfloop query="qResult3"> 
.... 
</cfloop> 

<cfreturn _results> 

對我來說,這是更清潔,更容易使用。它可能需要更多的開銷和服務器端處理,但更容易維護。並且JS端沒有解析,因爲返回的結構是正確的JSON格式。

+1

謝謝!相當新的使用結構,所以兩個後續問題 - a。 qResult1,qResult2,... - 可以返回不同數量的列,對吧?和in一樣,qResult1是table1的輸出,而qResult2是table2的輸出,其中table1和table2是完全不同的表,當我使它成爲一個結構時,這不會導致任何問題 - 正確嗎? b。你能否在「警告」部分添加更多細節?我沒有明白爲什麼我需要按摩qResults。我正在考慮將數據傳回AJAX,然後解析它。 再次感謝! – maverick

+1

將結構看作是其他變量的容器。它們是什麼類型的變量(簡單,數組,查詢,其他結構等)並不重要。容器將接受任何東西。 –

+1

是的,qResult1,qResult2 ...可以有不同的列。將結構視爲一個對象。結構具有可以是值,另一個結構或數組的屬性。通過按摩,我應該添加「...在JavaScript方面」。這已經有一段時間了,因爲我已經將查詢對象直接返回給javascript。我會用我通常做的事來修改我的答案。 – snackboy