Com 什么是VBScript错误代码0x800A01FB

Com 什么是VBScript错误代码0x800A01FB,com,asp-classic,vbscript,Com,Asp Classic,Vbscript,我有一个基于ASP、VB6、COM和SQL Server的解决方案。web服务器是IIS 6 每隔一段时间,我会在ASP页面上收到以下错误消息: Microsoft VBScript runtime (0x800A01FB) An exception occurred: 'objPSM.GetValue' (其中“objPSM”是我自己的会话处理COM类) 如果我重新加载页面,它就会工作 我试着用谷歌搜索错误代码,找到了本文(),但这不适用于我的问题,因为我没有使用会话对象——我有自己的会话处

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

每隔一段时间,我会在ASP页面上收到以下错误消息:

Microsoft VBScript runtime (0x800A01FB)
An exception occurred: 'objPSM.GetValue'
(其中“objPSM”是我自己的会话处理COM类)

如果我重新加载页面,它就会工作

我试着用谷歌搜索错误代码,找到了本文(),但这不适用于我的问题,因为我没有使用会话对象——我有自己的会话处理代码,它使用cookies和数据库来存储状态

下面是爆炸出来的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应用程序池。错误消失了。如果问题再次出现,将返回到此问题。

此错误最可能的来源是ADODB。看


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

看起来像-objPSM-可能正在使用一个记录集,该记录集或连接对象上的adUseClient作为参数之一,因为它正在GIT中使用

“COM提供了一个称为全局接口表(GIT)的组件。GIT允许应用程序在表中存储对对象接口的引用,以便随时检索接口指针。将接口指针存储到GIT中时,将查询对象的IMarshal,如果对象公开了IMarshal,则将对象的封送处理数据放入流中,以便e在稍后检索接口指针时检索。IMarshal由实际传递记录集数据的客户端游标公开。如果将使用adUseClient的打开ADO记录集对象放入GIT,然后从表中撤消,则会出现问题。将发生访问冲突。为避免此问题,请在调用记录集上的Open之前将记录集的接口指针放入GIT中。这将在调用客户端游标引擎之前将接口指针放入GIT中,这将导致发生标准封送处理,而不是记录通过IMarsha从游标引擎流式传输的数据l、 在这种情况下,只会存储一个指向ADO记录集接口的指针,这是程序员的真正意图。”

了解编组

看起来这在MDAC2.6中已修复


如何检查您的服务器版本的MDAC

所有此类错误代码都在winerror.h中定义(谷歌搜索了它并获得了此链接:首先阅读有关32位错误代码格式的内容,了解每一位的含义,以便将来可以理解类似的错误代码

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

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


#define FACILITY_CONTROL 10

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

您是否尝试应用支持文章中的修补程序?您使用了什么来清除您自己的会话处理COM类?VB6是一个很好的猜测吗?是的,如上所述,解决方案基于ASP页面t调用VB6 COM DLL,该DLL反过来与SQL Server数据库对话。是的,OP很可能必须按照您提供的链接中的指定安装/重新安装最新版本的MDAC。我将添加…MDAC 2.8的下载链接是我已更新了我的问题以显示VB代码。错误处理不起作用,因为VB运行时刚刚关闭。U使用调试器是不可能的,因为此错误仅发生在我无法控制的托管实例上(此错误不会发生在我的开发环境中,并且仅发生在生产环境中的每个4-5页视图中,尽管代码在每个页面上都被调用)。如果您的处理程序没有捕获错误,那么您将看到一个更严重的错误,您在windows事件日志中看到了什么吗?您可以与服务器所有者谈谈服务器上安装MDAC的情况吗?尝试在存储过程的顶部添加一个集合NOCOUNT。这是我常见的“尝试并查看”之一出于我无法理解的原因,解决方案通常会修复来自ADODB的奇怪错误。也就是说,VB.CO_E_OBJNOTREG中总是会捕捉到此类错误。这是一个ITF设施错误,它不会映射到所讨论的错误。winerror.h没有为控制设施定义任何错误,而控制设施是整个点。控制设施中的错误(以及512号以上的ITF)由控制或接口设计师自行分配。在确定来源之前,无法正确解释01FB。