Как устранить неполадки кода подпрограммы 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.
Обновление по комментариям:
Предположения:
- Execute_SQL () устанавливает xRS в набор записей, полученный в результате передачи в операторе SOL.
- SupportDesk.UserName является уникальным.
- Ошибка "EOF или BOF" выдается в строке
EmployeeID_OfCurrentUser = xRS("User_ID")
(потому что xRS пуст - см. доказательства) - Sub LookUpTheCurrentUsersEmployeeID_AndName () вызывается в таких контекстах, как
WTF
LookUpTheCurrentUsersEmployeeID_AndName
If 0 = EmployeeID_OfCurrentUser Then
' handle Employee not found
Else
' handle Employee found
End If
Факты:
- Если вы просто CreateObject("ADODB.Recordset") или пытаетесь выполнить.Execute/.Open с помощью неверного оператора SQL и скрыть эту проблему с помощью OERN, попытка получить доступ к его.RecordCount приводит к 3704-й операции. когда объект закрыт. " ошибка.
- Строка ошибки будет достигнута тогда и только тогда, когда.RecordCount не равен 0.
Заключение:
Строка ошибки будет достигнута, если.RecordCount
- 1 (предположение 2). В этом случае поля доступны; нет ошибки
- -1 и EOF: ошибка генерируется, потому что набор записей пуст (такого имени пользователя нет в вашей базе данных)
- -1, а не EOF: ошибка не выдается, потому что набор записей не пустой (в вашей базе данных есть такое имя пользователя)
Способ устранения:
Проверьте наличие xRS.EOF, чтобы убедиться, что у вас есть непустой набор записей при доступе к его полям в предложении Else.
Несмотря на первые сомнения Lankymart, запросы пользователей, которых нет (пока) в вашей базе данных, будут обрабатываться правильно, если предположение 4 выполнено.
Несмотря на второе сомнение Lankymart,.RecordCount всегда равен -1, безвреден, потому что вместо.RecordCount действительно релевантное предварительное условие "xRS.EOF" защищает доступ к полям набора записей.
Возможная причина:
Изменения в вашей базе данных / конфигурации соединения сделали прямые курсоры по умолчанию.
Voodoo:
Вы "заглядывали в таблицу Support", но ваш SQL ссылается на таблицу SupportDesk. Возможно, ваша проблема вызвана смешением имен таблиц.