2009-06-02 6 views
1

Ich habe eine Lösung basierend auf ASP, VB6, COM und SQL Server. Der Web-Server ist IIS 6.Was ist VBScript Fehlercode 0x800A01FB

In unregelmäßigen Abständen, erhalte ich die folgende Fehlermeldung auf der ASP-Seite:

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

(wo "objPSM" ist meine eigene Session-Handling-COM-Klasse).

Wenn ich die Seite neu lade, funktioniert es.

Ich habe versucht, den Fehlercode googeln, stellt es diesen Artikel (http://support.microsoft.com/kb/262681), aber das sollte nicht für mein Problem gelten, da ich nicht das Session-Objekt verwende - Ich habe meine eigene Session-Behandlung Code, Cookies und verwendet die Datenbank, um den Status zu speichern. Hier

ist der VB-Code, der Bomben aus:

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 

Beachten Sie, dass, auch wenn ein Fehler-Handler hier ist, wird der Code nie hier bekommt, weil die VB-Laufzeit beendet und die Ausnahme auslöst, was zu einem gebrochenen ASP-Seite statt still Protokollieren und eine leere Zeichenfolge zurückgeben.

Wer weiß, was der Fehlercode (0x800A01FB) bedeutet?

UPDATE: Gesprochen mit dem Hosting-Anbieter und sie den IIS-Anwendungspool recycelt. Der Fehler ist weg. Kehre zu dieser Frage zurück, wenn das Problem erneut auftritt.

+0

Haben Sie versucht, den Patch im Supportartikel zu installieren? – Eric

+0

Was haben Sie verwendet, um Ihre eigene Session-Handling-COM-Klasse zu erstellen? Wäre VB6 eine gute Schätzung? – AnthonyWJones

+0

Ja, wie angegeben, basiert die Lösung auf ASP-Seiten, die eine VB6-COM-DLL aufrufen, die wiederum mit einer SQL Server-Datenbank kommuniziert. – ObiWanKenobi

Antwort

1

Talked an den Hosting-Provider und sie recycelt der IIS-Anwendungspool. Der Fehler ist weg.

1

Die wahrscheinlichste Quelle für diesen Fehler ist ADODB. Siehe why-do-i-get-800a01fb-errors.

Da die COM-Klasse Ihre eigene ist, haben Sie in Betracht gezogen, einen Debugger an den Prozess anzuhängen, in dem ASP ausgeführt wird und wo in Ihrem COM-Code der Fehler auftritt? Fehlt das Hinzufügen einiger Fehlerbehandlung zu Ihrem COM-Code, um weitere Details zu dem Fehler zu generieren, bevor es Ihre Komponente verlässt?

+0

Ja, höchstwahrscheinlich muss das OP die neueste Version von MDAC installieren/neu installieren, wie in dem von Ihnen angegebenen Link angegeben. –

+0

Ich wollte hinzufügen ... der Download-Link für MDAC 2.8 ist http://www.microsoft.com/downloadS/details.aspx?FamilyID=6c050fe3-c795-4b7d-b037-185d0506396c&displaylang=en –

+0

Ich habe aktualisiert meine Frage, um den VB-Code zu zeigen. Die Fehlerbehandlung funktioniert nicht, da die VB-Laufzeit gerade beendet wird. Die Verwendung eines Debuggers ist nicht möglich, da dieser Fehler nur auf einer gehosteten Instanz auftritt, über die ich keine Kontrolle habe (der Fehler tritt nicht in meiner Entwicklungsumgebung auf und nur etwa alle 4-5 Seiten in der Produktion, obwohl der Code aufgerufen wird jede Seite). – ObiWanKenobi

0

Sieht aus wie - objPSM - kann ein RecordSet mit adUseClient als einen der Parameter entweder im RecordSet oder im Connection Object verwenden, wie es im GIT verwendet wird.

„COM stellt eine Komponente des Global Interface Table (GIT) genannt. Der GIT ermöglicht eine Anwendung einen Verweis auf eine Objektschnittstelle in der Tabelle zu speichern, so dass die Schnittstellenzeiger können jederzeit abgerufen werden können. Bei der Lagerung der Schnittstellenzeiger in das GIT, das Objekt wird nach IMarshal abgefragt, und wenn IMarshal durch das Objekt exponiert wird, werden die Marshallingdaten des Objekts in einen Strom plaziert, wo es zu einem späteren Zeitpunkt abgerufen werden kann, wenn der Schnittstellenzeiger abgerufen wird wird vom Clientcursor verfügbar gemacht, der die Übergabe der Datensatzdaten tatsächlich durchführt Es gibt ein Problem, wenn ein offenes ADO-Recordset-Objekt, das AdUseClient verwendet, in dem GIT platziert wird und später aus der Tabelle widerrufen wird. Zu vermeiden Stellen Sie den Schnittstellenzeiger des Recordset in das GIT, bevor Sie Open auf dem Recordset aufrufen, das Problem. Dadurch wird der Schnittstellenzeiger in das GIT platziert, bevor die Clientcursor-Engine aufgerufen wird, was im Wesentlichen dazu führt, dass Standardmarshalling stattfindet, anstatt Daten aufzuzeichnen, die über IMarshal von der Cursor-Engine gestreamt werden. In diesem Fall wird nur ein Zeiger auf die Schnittstelle des ADO-Recordsets gespeichert, was die wahre Absicht des Programmierers ist."http://support.microsoft.com/kb/249175/EN-US/

Um zu verstehen, Rangierung http://support.microsoft.com/kb/248287/EN-US/

Sieht aus wie dies in MDAC 2.6

wurde behoben Wie Sie Ihre Server-Version von MDAC http://support.microsoft.com/kb/301202

0

Alle diese Fehlercodes überprüfen sind in WinError definiert. h (Google gegoogelt und bekam diesen Link: winerror.h Lesen Sie zuerst über das 32-Bit-Fehlercode-Format, um zu verstehen, was jedes Bit bedeutet, damit Sie in Zukunft ähnliche Fehlercodes verstehen können .

01FB ist der Fehlercode: CO_E_OBJNOTREG (Objekt nicht registriert ist)

00A bezieht sich auf die "facility", wo der Fehler aufgetreten ist:

#define FACILITY_CONTROL 10

+0

CO_E_OBJNOTREG ist ein ITF-Einrichtungsfehler, der dem fraglichen Fehler nicht zugeordnet wird. winerror.h definiert keine Fehler für die CONTROL-Einrichtung, was der springende Punkt ist. Fehler in der CONTROL-Einrichtung (und der ITF über Nummern 512) werden nach Ermessen der Steuerungs- oder Schnittstellenentwickler zugewiesen. Der 01FB kann erst richtig interpretiert werden, wenn die Quelle identifiziert wurde. – AnthonyWJones