将多个 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 格式。
我正在构建一个网页,在提交网络表单后将进行 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 格式。