如何解决asp子例程代码问题

时间:2014-07-30 15:54:10

标签: vbscript asp-classic adodb

我的任务是解决以下错误。我没有使用asp的经验并寻求一些指导。这是错误:

  

ADODB.Field错误' 800a0bcd'       BOF或EOF为True,或者当前记录已被删除。请求的操作需要当前记录。       /include/asp/classTools.asp,line 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 个答案:

答案 0 :(得分:2)

测试

If xRS.EOF Then

而不是

If xRS.RecordCount = 0 Then

因为。Recordcount对于&#34可能为-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的比较,未检测到问题。

更新wrt评论:

假设:

  1. Execute_SQL()将xRS设置为传入的记录集 SOL声明。
  2. SupportDesk.UserName是唯一的。
  3. 错误&#34; EOF或BOF&#34;被扔进去了 EmployeeID_OfCurrentUser = xRS("User_ID")(因为xRS为空 - 见证据)
  4. 在上下文中调用Sub LookUpTheCurrentUsersEmployeeID_AndName() 像
  5. WTF

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

    事实:

    1. 如果您只是CreateObject(&#34; ADODB.Recordset&#34;)或者您尝试 .Execute /。使用错误的SQL语句打开并隐藏此问题 使用OERN,尝试访问其.RecordCount导致3704 &#34;关闭对象时不允许操作。&#34;错误。
    2. 当且仅当.RecordCount不是时,才会到达错误行 等于0。
    3. 结论:

      如果.RecordCount

      ,将会到达错误行
      • 1(假设2)。在这种情况下,字段是可访问的;没有 错误。
      • -1 和EOF :抛出错误,因为记录集为空(数据库中没有此类UserName)
      • -1 且不是EOF :由于记录集不为空(数据库中存在此类用户名),因此不会引发错误

      处理:

      检查xRS.EOF以确保在访问其字段时具有非空记录集 在Else条款中。

      尽管Lankymart首先怀疑,如果假设4成立,对数据库中尚未(尚未)用户的查询将得到正确处理。

      尽管Lankymart的第二个疑问,.RecordCount始终为-1是无害的,因为而不是.RecordCount,真正相关的前提条件是#RS;是xRS.EOF&#34;保护对记录集字段的访问。

      可能的原因:

      对数据库/连接配置的更改使Forward Cursors成为默认值。

      巫毒:

      你看着桌子支持&#39;但是你的SQL指的是表SupportDesk。也许你的 问题是由混合表名引起的。