Что такое код ошибки VBScript 0x800A01FB - PullRequest
1 голос
/ 02 июня 2009

У меня есть решение на основе ASP, VB6, COM и SQL Server. Веб-сервер IIS 6.

С нерегулярными интервалами на странице ASP появляется следующее сообщение об ошибке:

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

(где "objPSM" - это мой собственный COM-класс для обработки сеансов).

Если я перезагружаю страницу, она работает.

Я попытался найти код ошибки в Google, и эта статья появляется (http://support.microsoft.com/kb/262681),, но это не должно относиться к моей проблеме, поскольку я не использую объект Session - у меня есть собственный код обработки сеанса, который использует куки и база данных для хранения состояния.

Вот код 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. Ошибка ушла. Вернемся к этому вопросу, если проблема появится снова.

Ответы [ 4 ]

1 голос
/ 02 сентября 2009

Поговорили с хостинг-провайдером, и они переработали пул приложений IIS. Ошибка ушла.

1 голос
/ 02 июня 2009

Наиболее вероятным источником этой ошибки является ADODB. См. why-do-i-get-800a01fb-errors .

Поскольку COM-класс является вашим собственным, рассматривали ли вы возможность присоединить отладчик к процессу, в котором работает ASP, и посмотреть, где в вашем COM-коде происходит ошибка? Если вы не добавите некоторую обработку ошибок в ваш COM-код, чтобы получить более подробную информацию об ошибке, прежде чем она покинет ваш компонент?

0 голосов
/ 02 июня 2009

Все такие коды ошибок определены в winerror.h (Гуглили его и получили эту ссылку: winerror.h Сначала прочитайте о формате 32-битных кодов ошибок, чтобы понять, что означает каждый бит, так что вы может понять подобные коды ошибок в будущем.

01FB - код ошибки: CO_E_OBJNOTREG (объект не зарегистрирован)

00A относится к «объекту», где произошла ошибка:

#define FACILITY_CONTROL 10

0 голосов
/ 02 июня 2009

Похоже, что - objPSM - может использовать RecordSet с adUseClient в качестве одного из параметров либо в RecordSet, либо в объекте соединения, так как он используется в GIT.

"COM предоставляет компонент, называемый Глобальной интерфейсной таблицей (GIT). GIT позволяет приложению сохранять ссылку на интерфейс объекта в таблице, чтобы указатель интерфейса можно было получить в любое время. При сохранении указателя интерфейса в GIT объект запрашивается для IMarshal, и если IMarshal экспонируется объектом, данные маршалинга объекта помещаются в поток, где они могут быть получены через некоторое время, когда указатель интерфейса извлекается. клиентский курсор, который фактически выполняет передачу данных набора записей. Существует проблема, если открытый объект ADO Recordset, который использует adUseClient, помещается в GIT, а затем отзывается из таблицы. Нарушение доступа будет иметь место. Чтобы избежать проблемы, поместите указатель интерфейса набора записей в GIT перед вызовом Open для набора записей.Это поместит указатель интерфейса в GIT до вызова механизма курсора клиента, который по существу будет заставить стандартный маршалинг происходить, а не записывать данные, передаваемые из движка курсора через IMarshal. В этом случае будет храниться только указатель на интерфейс ADO Recordset, что является реальным намерением программиста. "http://support.microsoft.com/kb/249175/EN-US/

Чтобы понять Marshalling http://support.microsoft.com/kb/248287/EN-US/

Похоже, это было исправлено в MDAC 2.6

Как проверить серверную версию MDAC http://support.microsoft.com/kb/301202

...