【问题标题】:What is VBScript error code 0x800A01FB什么是 VBScript 错误代码 0x800A01FB
【发布时间】:2009-10-22 11:17:38
【问题描述】:

我有一个基于 ASP、VB6、COM 和 SQL Server 的解决方案。 Web 服务器是 IIS 6。

不定期地,我在 ASP 页面上收到以下错误消息:

Microsoft VBScript runtime (0x800A01FB)
An exception occurred: 'objPSM.GetValue'

(其中“objPSM”是我自己的会话处理 COM 类)。

如果我重新加载页面,它会起作用。

我尝试用谷歌搜索错误代码,它出现了这篇文章 (http://support.microsoft.com/kb/262681),但这不适用于我的问题,因为我不使用 Session 对象——我有自己的使用 cookie 的会话处理代码以及存储状态的数据库。

下面是爆出来的VB代码:

Public Function GetValue(ByVal pSessionID As String, _
                         ByVal pName As String) As String

   Dim ErrSource As String
   Dim ErrNumber As Long
   Dim ErrDescription As String

   On Error GoTo Err_Handler

   Dim lConn As ADODB.Connection
   Dim cmd As ADODB.Command

   Dim lReturnValue As String

   Set lConn = GetDBConn
   Set cmd = CreateObject("ADODB.Command")
   cmd.ActiveConnection = lConn
   cmd.CommandText = "pss_getvalue"

   cmd.Parameters.Append cmd.CreateParameter("p_pss_id", adVarChar, adParamInput, 36, pSessionID)
   cmd.Parameters.Append cmd.CreateParameter("p_pss_name", adVarChar, adParamInput, 35, pName)
   cmd.Parameters.Append cmd.CreateParameter("p_pss_value", adVarChar, adParamOutput, 255)

   cmd.Execute , , adCmdStoredProc

   lReturnValue = Nvl(cmd.Parameters("p_pss_value").Value, "")

   lConn.Close
   Set cmd = Nothing
   Set lConn = Nothing

   GetValue = lReturnValue

Exit_Procedure:
   Exit Function

Err_Handler:
   ErrSource = Err.Source
   ErrNumber = Err.Number
   ErrDescription = Err.Description
   On Error Resume Next
   Call LogEvent(ErrSource & ".GetValue: ", ErrNumber & ": " & ErrDescription)
   GetValue = ""
   GoTo Exit_Procedure
End Function

请注意,即使此处有错误处理程序,代码也永远不会到达此处,因为 VB 运行时停止并引发异常,从而导致 ASP 页面损坏,而不是静默记录并返回空白字符串。

有人知道错误代码(0x800A01FB)是什么意思吗?

更新:与托管服务提供商交谈,他们回收了 IIS 应用程序池。错误消失了。如果问题再次出现,将返回此问题。

【问题讨论】:

  • 您是否尝试应用支持文章中的补丁?
  • 你用什么来创建你自己的会话处理 COM 类? VB6 会是一个很好的猜测吗?
  • 是的,如上所述,该解决方案基于调用 VB6 COM DLL 的 ASP 页面,该 DLL 反过来与 SQL Server 数据库通信。

标签: com asp-classic vbscript


【解决方案1】:

此错误最可能的来源是 ADODB。见why-do-i-get-800a01fb-errors

既然 COM 类是您自己的,您是否考虑过将调试器附加到运行 ASP 的进程并查看您的 COM 代码中发生错误的位置?未能在您的 COM 代码中添加一些错误处理以在错误离开您的组件之前生成有关错误的更多详细信息?

【讨论】:

  • 是的,很可能 OP 必须按照您提供的链接中的说明安装/重新安装最新版本的 MDAC。
  • 我要添加... MDAC 2.8 的下载链接是microsoft.com/downloadS/…
  • 我已更新我的问题以显示 VB 代码。错误处理不起作用,因为 VB 运行时刚刚关闭。无法使用调试器,因为此错误仅发生在我无法控制的托管实例上(该错误不会发生在我的开发环境中,并且仅在生产中的每 4-5 页面视图中发生,尽管代码被调用每页)。
  • 如果您的处理程序没有捕捉到错误,那么您会看到更严重的错误,您是否在 Windows 事件日志中看到任何内容?你能和服务器所有者谈谈服务器上安装 MDAC 的情况吗?
  • 尝试在存储过程的顶部添加一个 SET NOCOUNT ON。那是我常见的“尝试和查看”解决方案之一,由于我无法解决的原因,它经常修复来自 ADODB 的奇怪错误。就是说这样的错误总是可以在 VB 中被捕获。
【解决方案2】:

与托管服务提供商交谈,他们回收了 IIS 应用程序池。错误消失了。

【讨论】:

    【解决方案3】:

    所有此类错误代码都在winerror.h中定义(谷歌搜索并得到这个链接:winerror.h首先阅读32位错误代码格式以了解每个位的含义,以便您可以理解类似的错误代码在未来。

    01FB 为错误代码:CO_E_OBJNOTREG(对象未注册)

    00A 指的是发生错误的“设施”:

    #define FACILITY_CONTROL 10

    【讨论】:

    • CO_E_OBJNOTREG 是 ITF 设施错误,它不会映射到相关错误。 winerror.h 没有为 CONTROL 工具定义任何错误,这是重点。控制设施中的错误(以及编号 512 上的 ITF)由控制或界面设计者自行决定分配。在确定源之前,无法正确解释 01FB。
    【解决方案4】:

    看起来 - objPSM - 可能正在使用带有 adUseClient 的 RecordSet 作为 RecordSet 或连接对象上的参数之一,因为它正在 GIT 中使用。

    "COM 提供了一个称为全局接口表 (GIT) 的组件。GIT 允许应用程序在表中存储对对象接口的引用,以便可以随时检索接口指针。在存储接口指针时进入 GIT,查询对象的 IMarshal,如果 IMarshal 被对象公开,则对象的编组数据被放入一个流中,可以在稍后检索接口指针时检索它。实际执行记录集数据传递的客户端游标。如果将使用 adUseClient 的打开 ADO Recordset 对象放入 GIT 中,然后从表中撤消,则会出现问题。将发生访问冲突。 为避免此问题,请在调用 Recordset 之前将 Recordset 的接口指针放入 GIT。这将在调用客户端游标引擎之前将接口指针放入 GIT,这将是必不可少的ly 导致发生标准封送处理,而不是记录从游标引擎通过 IMarshal 流式传输的数据。在这种情况下,只会存储指向 ADO 记录集接口的指针,这是程序员的真正意图。”http://support.microsoft.com/kb/249175/EN-US/

    了解编组http://support.microsoft.com/kb/248287/EN-US/

    看起来这在 MDAC 2.6 中已修复

    如何查看你的服务器版本的 MDAC http://support.microsoft.com/kb/301202

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2012-09-29
      • 2015-05-18
      • 1970-01-01
      • 2021-05-23
      相关资源
      最近更新 更多