在经典ASP中运行长数据库查询的最佳方法?

时间:2009-09-15 12:46:34

标签: ajax asp-classic

由于数据模型和表中保存的数据量,我对网站有几个查询需要很长时间才能运行。到目前为止,我一直在针对数据库手动运行它们以避免任何超时问题等。但是网站所有者要求在网站上提供这些以便他可以获得查询结果。

我曾经想过通过.NET Web服务执行此操作并让经典的ASP页面异步调用它。网页将启动该过程,然后再将用户重定向到另一个屏幕。然后,Web服务将运行查询并以CSV格式向用户发送结果。

然而,我似乎无法让这个工作。如果我通过IE中的屏幕调用它,但是在ASP中通过Ajax调用调用它似乎是一个问题 - 该服务运行正常 - 没有生成错误,但也没有创建CSV文件。

我附上了下面的经典ASP代码。该服务只有一个方法,其名称为email的参数,其类型为字符串。任何人都可以看到它有什么问题吗?另外,这是做这个的最好方法还是我应该考虑另一种方法?

提前致谢,

菲尔

CODE

<%
message = "http://wwww.example.com/service/query.asmx/GetResults?email=test"
set req = server.createobject("MSXML2.XMLHTTP")
With req
    .open "GET", message, False
    .setRequestHeader "Content-Type", "text/xml"
    .send
End With

works = req.responseText
response.redirect "http://www.bbc.co.uk"

%>

2 个答案:

答案 0 :(得分:3)

异步请求工作并安排其后期交付的想法对我来说似乎非常合理。我不会说ASP太好,不知道你的尝试会弄什么,但这真的是你在那里的一个白话! seb服务是否也会受到HTTP连接超时的影响?

我的方法是将Ajax请求放在队列上并返回,不需要重定向,你仍然在用户发出请求的页面上,你的java脚本可能只是承认请求已发送。另外,您更传统的“提交页面,存储请求,显示另一个页面”appraoch可以正常工作,但存储只是将请求放在队列中。

排队方法的一个优点是通过控制守护进程的数量,我们可以在为请求提供服务时获得受控的并行性 - 避免数据库过载。队列也可以持续存在并允许悠闲地传递回复。

我假设MS队列然后让你有一个守护进程处理reuquest并传递响应。显然电子邮件是有效的,但让我觉得有点不友好。使用Ajax样式接口,可以很容易地无形地轮询请求状态并在准备好后获得结果,甚至可以使用Comet风格的推送传递响应。

答案 1 :(得分:1)

这里的问题,正如 djna 所指出的,是你没有调用回调函数。 由于Ajax的异步方面,您已经设置了一个回调函数,该函数将在Ajax调用结束时执行。

长话短说:
从javascript函数调用webservice,最好使用JQuery以避免跨浏览器的不兼容性

代码:

<div id="results">Processing query. Please wait</div>

<script type="text/javascript">
$(document).ready(function(){
    $("#results").load("http://wwww.mywebsite.com/service/query.asmx/GetResults?email=test&Rnd=" + Math.random().toString()); 
});
</script>