Как устранить неполадки кода подпрограммы ASP

Мне было поручено устранить следующую ошибку. У меня нет опыта работы с asp и я ищу какое-то руководство. Вот ошибка:

Ошибка ADODB.Field '800a0bcd' Либо BOF, либо EOF имеет значение True, или текущая запись была удалена. Запрашиваемая операция требует текущей записи. /include/asp/classTools.asp, строка 700

Я нашел этот класс и открыл его до строки с ошибкой и подпрограммы объемного звучания, и получил это:

Private Sub LookUpTheCurrentUsersEmployeeID_AndName()
    Dim User
    User = Request.ServerVariables("AUTH_USER")
    User = Right(User, (Len(User) - InStrRev(User,"\") ) )
    Execute_SQL("SELECT User_ID, FirstName, LastName, EmailAddr FROM SupportDesk WHERE UserName = '" & User & "'")
    If xRS.RecordCount = 0 Then
        EmployeeID_OfCurrentUser = 0
        EmployeeFullName = User
        EmployeeEmailAddress = "unknownEmailAddress"
    Else
        EmployeeID_OfCurrentUser = xRS("User_ID")
        EmployeeFullName = xRS("FirstName") & " " & xRS("LastName")
        EmployeeEmailAddress = xRS("EmailAddr")
    End If
    bLookedUpTheID_AndName = True
End Sub 

Я посмотрел в таблице поддержки и не нашел нулевых записей. На что еще я должен смотреть? Логика для этого подпрограммы звучит?

1 ответ

Решение

Тестовое задание

If xRS.EOF Then

вместо

If xRS.RecordCount = 0 Then

так как. Recordcount может быть -1 для "нет доступных счетчиков", если набор записей только для пересылки.

Доказательства:

>> Set c = CreateObject("ADODB.Connection")
>> c.Open "dsn=NWind"
>> Set r = c.Execute("Select * From Employees Where EmployeeId=1")
>> WScript.Echo r.Recordcount, r("EmployeeId")
>> Set r = c.Execute("Select * From Employees Where EmployeeId=0")
>> WScript.Echo r.Recordcount
>> WScript.Echo r("EmployeeId")
>>
-1 1 <------- non-empty rs; recordcount <> 0!
-1   <------- empty rs; recordcount <> 0! ---------> oramel's error:
Error Number:       -2147352571
Error Description:  Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.

Данная ошибка возникает из-за попытки доступа к полю пустого набора записей; проблема не обнаружена из-за сравнения с 0.

Обновление по комментариям:

Предположения:

  1. Execute_SQL () устанавливает xRS в набор записей, полученный в результате передачи в операторе SOL.
  2. SupportDesk.UserName является уникальным.
  3. Ошибка "EOF или BOF" выдается в строкеEmployeeID_OfCurrentUser = xRS("User_ID") (потому что xRS пуст - см. доказательства)
  4. Sub LookUpTheCurrentUsersEmployeeID_AndName () вызывается в таких контекстах, как

WTF

LookUpTheCurrentUsersEmployeeID_AndName
If 0 = EmployeeID_OfCurrentUser Then
   ' handle Employee not found
Else
   ' handle Employee found
End If

Факты:

  1. Если вы просто CreateObject("ADODB.Recordset") или пытаетесь выполнить.Execute/.Open с помощью неверного оператора SQL и скрыть эту проблему с помощью OERN, попытка получить доступ к его.RecordCount приводит к 3704-й операции. когда объект закрыт. " ошибка.
  2. Строка ошибки будет достигнута тогда и только тогда, когда.RecordCount не равен 0.

Заключение:

Строка ошибки будет достигнута, если.RecordCount

  • 1 (предположение 2). В этом случае поля доступны; нет ошибки
  • -1 и EOF: ошибка генерируется, потому что набор записей пуст (такого имени пользователя нет в вашей базе данных)
  • -1, а не EOF: ошибка не выдается, потому что набор записей не пустой (в вашей базе данных есть такое имя пользователя)

Способ устранения:

Проверьте наличие xRS.EOF, чтобы убедиться, что у вас есть непустой набор записей при доступе к его полям в предложении Else.

Несмотря на первые сомнения Lankymart, запросы пользователей, которых нет (пока) в вашей базе данных, будут обрабатываться правильно, если предположение 4 выполнено.

Несмотря на второе сомнение Lankymart,.RecordCount всегда равен -1, безвреден, потому что вместо.RecordCount действительно релевантное предварительное условие "xRS.EOF" защищает доступ к полям набора записей.

Возможная причина:

Изменения в вашей базе данных / конфигурации соединения сделали прямые курсоры по умолчанию.

Voodoo:

Вы "заглядывали в таблицу Support", но ваш SQL ссылается на таблицу SupportDesk. Возможно, ваша проблема вызвана смешением имен таблиц.

Другие вопросы по тегам