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

时间:2017-06-28 14:41:48

标签: json ajax coldfusion cfc

我正在构建一个网页,在webform提交后会进行AJAX调用。 AJAX然后调用cfc,其中有一个函数调用SQL存储过程将webform值作为输入参数传递。直到这里很好,但我对如何将数据返回到调用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 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

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

这里需要注意的是,您可能需要按摩qResults。通常,我会遍历每个查询并构建一个数组。但这只是个人偏好。返回查询时我通常做的是循环遍历它并构建一个新结构。这是因为我可能想对每个属性执行添加操作。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.wtpd]
@="Water Treatment Plant Design File"

[HKEY_CLASSES_ROOT\.wtpd\DefaultIcon]
@="C:\\\\Users\\\\user\\\\Downloads\\\\wtpd_file.ico"

[HKEY_CLASSES_ROOT\.wtpd\shell]

[HKEY_CLASSES_ROOT\.wtpd\shell\open]

[HKEY_CLASSES_ROOT\.wtpd\shell\open\command]
@="\"C:\\Users\\user\\Desktop\\ENV\\electron.exe\" \"%1\""

对我来说,这更干净,更容易使用。它可能需要更多的开销和服务器端处理,但它更容易维护。并且JS方面没有解析,因为返回的结构是正确的JSON格式。