我正在构建一个网页,在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。
谢谢!
答案 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格式。