【问题标题】:Classic ASP Error: Operation is not allowed when the object is closed经典 ASP 错误:关闭对象时不允许操作
【发布时间】:2019-11-21 07:08:08
【问题描述】:

我已经从其他一些对此问题的回复中浏览并实施了代码,但我仍然没有运气。我仍然收到错误消息。

    If ((bReport And bIsDate And CheckPermissions("lotsales")) Or Request.QueryString("report")) Then
    OpenDB
    Dim oRs, sSQL, sSQL2, iCancellations, iSales, sDate, sInitDate, sEndDate, iPhaseID, iPhaseNumber, rowCount

    sInitDate = Request("startDate")
    sEndDate = Request("endDate")
    sSQL = "sp_get_lot_sales_test '" & sInitDate & "', '" & sEndDate & "', " & sPhase & ", '" & sReportView & "'"

    'response.write vbNewLine & "<!-- sql: " & sSQL & "-->" & vbNewLine
    'response.write sSQL
    'response.Flush
    Set oRs = ExecuteCommand(sSQL,1) 
End If

然后这里是错误发生的地方 -

If (oRs.EOF) Then <-- fails here
       Response.Write("<TR><TD ALIGN=""center"">There is no data to report on!</TD></TR>")
    Else
        Do While Not oRs.EOF

作为最后的手段,我将返回存储过程并对其进行解构,以确保一切正常。有没有人知道为什么我可能会收到错误?我不会在任何地方关闭。

这里是 ExecuteCommand 函数 -

Function ExecuteCommand(s,i)
    On Error Resume Next
    Set ExecuteCommand = oDBc.Execute(s, , i)
End Function

【问题讨论】:

  • 多年来没有做过经典 ASP,但我尝试的第一件事是将“dim oRs”移到 if 语句之外。
  • 那行不通。我有另一个以相同方式设置的文件,它可以工作,只是调用了一个不同的存储过程。这是我继承的代码。
  • 你确定IF块中的代码正在执行吗?
  • 我们需要查看ExecuteCommand方法的代码——有问题。

标签: asp-classic vbscript adodb


【解决方案1】:

这可能是旧的,但我经常遇到该错误(关闭对象时不允许操作)。

我所做的是在存储过程中,我添加了以下内容:

设置无计数

设置 ANSI_WARNINGS 关闭

过程中AS的正下方。

这就是我所做的一切,问题就消失了。

【讨论】:

  • 虽然这“解决”了问题,但它的方法类似于注意到仪表板上的警告灯,然后弹出仪表板并解开灯泡上的电线,现在警告灯不再是问题.. 话虽如此,做你必须做的,但如果事情在其他地方开始变得奇怪,并且你的 SP 没有表明为什么会发生奇怪的事情,请记住这一点。跨度>
【解决方案2】:

我正在为一个客户端维护一些旧的 Classic ASP 代码,这些代码是我们从以前的开发人员那里接管的,这个错误让我发疯了 4 个小时。

我终于在关联的 SQL 存储过程中发现了一些 PRINT 语句,这些语句用于故障排除或检查值,但实际上并不返回行,但它们导致此操作失败:

Set cnContentDB = Server.CreateObject("ADODB.Connection")
cnContentDB2.Open sString

sSQL = "EXEC YourStoredProc"

Set oRS2 = Server.CreateObject("ADODB.Recordset")
oRS2.Open sSQL, cnContentDB

if not oR2.EOF then   'THIS WAS GIVING THE ERROR,
                      'EVEN THOUGH THE STORED PROC ALWAYS RETURNS RECORDS

我删除了 Print 语句,错误消失了。

【讨论】:

    【解决方案3】:

    尽管这已经有多年历史了,但我们最终还是会在这里寻找解决方案。 对我来说,这个错误的原因是用户对存储过程没有执行权限。授予执行权限解决了错误。

    【讨论】:

      【解决方案4】:

      你需要一个连接对象。

      set conn = server.CreateObject("adodb.connection")
      set oRs = conn.execute(sSql)
      

      【讨论】:

      • 您之前是否在代码中创建了记录集对象?这不仅仅是一个变量。
      • 您使 oRs 变暗,但我没有看到您在代码中创建记录集对象:Set oRs = Server.CreateObject("ADODB.Recordset")
      • 我这样做并得到了相同的结果。我试过重新配置连接,前后测试过,但无法摆脱错误。然而,这个 EXACT 代码适用于另一个存储过程,所以我现在正在解构 SP。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2016-12-06
      • 2021-10-24
      相关资源
      最近更新 更多