【问题标题】:An Erroneous SQL Query makes browser hang until script timeout exceeded错误的 SQL 查询使浏览器挂起,直到超出脚本超时
【发布时间】:2010-04-16 08:48:47
【问题描述】:

我在经典 ASP Web 应用程序中有一个管理页面,允许管理员用户对数据库运行查询 (SQL Server 2000)

真正奇怪的是,如果您发送的查询中有错误(无效的表连接、您忘记分组的列等),浏览器会挂起(CPU 使用率达到最大值),直到 SERVER 脚本超时超出,然后吐出超时超出错误(服务器和浏览器在不同的机器上,所以不知道这是怎么发生的!)我在 IE 8 和 FF 3 中尝试过,结果相同。

如果您直接从 SQL 企业管理器运行相同的查询(有错误),它会立即返回真正的错误。这是一项安全功能吗?有谁知道如何关闭它?它甚至发生在与数据库的连接使用“sa”凭据时,所以我认为它不是安全设置:(

Dim oRS 
Set oRS = Server.CreateObject("ADODB.Recordset") 
oRS.ActiveConnection = sConnectionString 

// run the query - this is for the admin only so doesnt check for sql safe commands etc. 
oRS.Open Request.Form("txtSQL") 

If Not oRS.EOF Then 
    // list the field names from the recordset 
    For i = 0 to oRS.Fields.Count - 1 
        Response.Write oRS.Fields(i).name & " " 
    Next 
    // show the data for each record in the recordset 
    While Not oRS.EOF 
        For i = 0 to oRS.Fields.Count - 1 
       Response.Write oRS.Fields(i).value & " " 
        Next 
        Response.Write "<br />" 
        oRS.Movenext() 
    Wend 
End If 

【问题讨论】:

  • 如果创建单独的连接对象,问题是否仍然存在?
  • 您是否添加了调试代码以查看 ASP 能走多远?它是否会在 oRS.Open() 上引发错误(应该如此)?
  • 如果您使用 ADODB.Connection 和 Execute() 方法会有所不同吗?此外,您可能想尝试将 CommandTimeout 属性设置为相对较低的值,看看是否有帮助。
  • @Alex K & thomask - 在第一个 Response.Write 上抛出 Timeout expired 错误。更改 CommandTimeout 只会使 Timeout Expired 错误更快出现。使用 ADODB.Connection 对象和 Execute() 方法得到相同的响应:(
  • 您使用 ODBC 还是 SQLOLEDB 提供程序?

标签: sql-server browser asp-classic iis-6


【解决方案1】:

尝试获取 ASP 的核心内容(完成工作的位)并将其粘贴到纯 VBS 脚本中,然后通过 cscript(即 cscript bit_wot_does_stuff.vbs)从 cmd 提示符运行它,看看它有多快回来。 [将Server.CreateObject 更改为CreateObject 并将任何Response.Write 更改为WScript.Echo 以使其在cmd 环境中工作]。

希望这将告诉您问题出在 ASP/IIS 中还是在 ADO 库的一些奇怪之处(虽然代码看起来不错,但我还没有执行它:-))。

希望它能给你一些东西,然后再进一步追踪。

【讨论】:

  • 好主意,谢谢。有趣的是,它会立即返回 SQL 错误!因此怀疑得到证实,SQL Server 不会在来自 IIS 的 SQL 查询中返回语法错误——现在的问题是为什么以及如何修复它...... :)
  • 如果它挂起浏览器,它一定是有很大的故障......你在运行fiddler2.com/fiddler2时查看了IE中的页面加载吗?
  • 抱歉延迟响应 - stackoverflow 决定我不需要通知你的帖子 :) 使用 Fiddler 我可以看到页面加载只是挂起,直到从 IIS 发布超时错误 - 我不明白为什么挂起浏览器,但更重要的是,为什么 SQL Server(以及 IIS)需要这么长时间才能返回超时错误以及为什么它不返回 REAL 错误!
  • @Jimbo - 我无法回答那个问题。以我的经验,错误往往会毫无延迟地直接在堆栈中冒泡。当我有机会使用 2k 数据库时,我会逐字尝试您的 ASP,看看我得到了什么。不过可能需要一两天。另一件要做的事情(也许):除非您确切知道执行要到达 ASP 中的哪一行,否则请在每一行添加一个“Response.Write/Response.Flush”,Response.Flush 是强制性的,所以 Write 是直接发送到浏览器。即使浏览器不显示数据,查看 Fiddler 跟踪也应该表明 ASP 走了多远......
【解决方案2】:

解决方案(只是为了关闭帖子,因为它不会得到解决!)

升级到 SQL Server 2005/2008/R2 - 解决了问题:)

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 2022-01-12
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2012-08-19
    • 2013-04-24
    相关资源
    最近更新 更多