虽然循环在ASP经典页面中超时

时间:2013-10-23 11:29:15

标签: asp-classic recordset

我的老板在10年前编写了这个非常复杂的软件,并要求我将其迁移到我刚刚在VPS上设置的新IIS 7服务器上。我设法让一切工作顺利,除了一个超时的微循环并将CPU发送到100%。

这是罪魁祸首:

rs_ss.open  "SELECT DISTINCT idMC, idUtente, Categoria FROM forte01.RisorseS WHERE idmc=" & request.querystring("idmc") & " and idutente=" & session("idutente") &  " order by  categoria" ,conn 

if not rs_ss.eof then
     do while not rs_ss.eof

        'conta gli elementi della sottosezione
        rse.filter ="categoria='" & rs_ss("categoria") & "'"
        if not rse.eof then
            n=0
            do while not rse.eof        
                rse.movenext
                n=n+1
            loop
            rse.movefirst   
            r=1
            do while not rse.eof
                dettagliarisorse rse, "s_ss",r ,n
                r=r+1
                rse.movenext
            loop
        end if
        rse.filter =""
        rs_ss.movenext
     loop
end if
rs_ss.close

如果我只是删除或注释掉中心部分:

rs_ss.open  "SELECT DISTINCT idMC, idUtente, Categoria FROM forte01.RisorseS WHERE idmc=" & request.querystring("idmc") & " and idutente=" & session("idutente") &  " order by  categoria" ,conn 

if not rs_ss.eof then
 do while not rs_ss.eof
   rs_ss.movenext
 loop
end if
rs_ss.close

它一直在做。

在旧域上它没有问题。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

这取决于代码顶部的查询中返回的数据。如果它返回了很多行,那么这将采用非常慢的路径来计算行数。重写查询以计算categoria的出现次数,这样您就不会在代码中执行此操作,因此可以将该循环放在n = n + 1周围。

此外,顶部的查询有一个很大的禁忌!您将原始查询字符串值直接传递到内联SQL查询。这是易受SQL注入攻击的代码示例。通过查询字符串“idmc”传递的值可以很容易地用作SQL注入攻击中的入口点。如果这是一个整数数字,至少将它包装在一个函数中,该函数不允许将自由格式文本传递给内联SQL。即。

CInt(Trim(request.querystring("idmc")))

答案 1 :(得分:0)

问题在于Sql Server用户权限。用户无权访问该特定架构。