将多个 cfquery 结果返回给 AJAX 调用

Returning multiple cfquery result back to AJAX call

我正在构建一个网页,在提交网络表单后将进行 AJAX 调用。 AJAX 然后调用一个 cfc,其中有一个调用 SQL 存储过程的函数,将 webform 值作为输入参数传递。直到这里都很好,但是我对如何 return 数据返回到调用 AJAX 函数感到困惑 - 当有多个结果集 return 由存储过程编辑时。

更清楚地说,存储过程内部有许多 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。

谢谢!

您可以尝试这样的操作:

<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 格式。