代码在DAO中是正常的,但在ADO中给出了运行时错误“3021”

时间:2011-05-13 16:35:50

标签: ms-access vb6 ado dao

在使用Access 97数据库的VB6项目中用ADO替换DAO后会发生这种情况。

它出现在以下代码段中标记为“错误:

”的行上
If rset.BOF <> True Or rset.EOF <> True Then
  rset.MoveLast 
  Do While rset.BOF <> True
     rset.Delete
     If rset.BOF <> True Or rset.EOF <> True Then  
         rset.MoveLast    'Error Here
     End If
   Loop
End If

运行时错误'3021'给出了这样的解释:

  

“EOF或BOF是真的,或者是   当前记录已被删除。   请求的操作需要电流   记录“。

在记录集中的最后一条记录被删除之后,似乎在ADO版本的代码中BOF +/- EOF仍为假,而在DAO版本中都是如此。 如果我像这样改变代码它可以工作

编辑:以下代码不起作用。当我尝试这个'解决方案'时所有的记录 已从表中删除,因此绕过了整个块,因此没有抛出任何错误。对不起的信息感到抱歉。

If rset.BOF <> True Or rset.EOF <> True Then
      rset.MoveLast 
      Do While rset.BOF <> True
         rset.Delete
         If rset.BOF <> True Or rset.EOF <> True Then 
         End If
         If rset.BOF <> True Or rset.EOF <> True Then  
             rset.MoveLast    
         End If
       Loop
End If

有人可以解释一下吗? (理想情况下提供不涉及更改代码的解决方案!)

进一步编辑:据我所知,尝试了很多方法,BOF和EOF在ADO中无用,用于在删除后测试空记录集。这是因为您需要使用其中一种移动方法来更新BOF / EOF,如果记录集为空,则会出现错误。在我使用的记录集上,RecordCount属性在删除后更新。虽然我不打算使用它,但此代码

If rset.BOF <> True Or rset.EOF <> True Then
   Do While rset.RecordCount > 0
      rset.MoveLast
      rset.Delete
   Loop
End If

编辑(1个月后) 因此,在重写了一大堆代码之后,我遇到了一个包含删除但没有出错的循环。唯一的区别是这个循环每次都删除记录集中的第一条记录而不是最后一条记录,因此每次删除它之后都会删除它 MOVEFIRST而不是MOVELAST。 所以我尽可能地减少了代码,下面的代码片段在Postgresql和Access,我试过的2个数据库,使用ADO的VB6上工作正常。

Do While rset.EOF <> True
     rset.Delete
     rset.MoveFirst
Loop

删除最终记录后,EOF和BOF仍为false,但调用MOVEFIRST方法时不会出错。现在调用MOVEFIRST将EOF和BOF都设置为true并退出循环。 相反,如果用MOVELAST替换MOVEFIRST方法,则在两个数据库上都会发生(3021)错误。 在他的回答中,rskar引用了MSDN

  

使用MoveNext方法移动   目前的记录位置一个记录   向前(朝向底部)   记录)。如果最后一条记录是   当前记录,你打电话给   MoveNext方法,ADO设置当前   记录到最后一个位置   记录在Recordset中(EOF为True)。   试图向前迈进的时候   EOF属性已生成True   错误。

他们提到MOVENEXT导致错误,我想,因为MOVELAST在同一方向上运动,这就解释了为什么它也会导致错误。 我只是希望我没有假设所有的移动方法都会导致类似的问题

1 个答案:

答案 0 :(得分:3)

请参阅http://msdn.microsoft.com/en-us/library/ms675787(v=vs.85).aspx

  

如果删除最后剩余的   记录在Recordset对象中   BOF和EOF属性可能仍然存在   在您尝试重新定位之前为假   目前的记录。

由于ADO不是DAO,因此行为上的差异不应太令人惊讶。看起来对MoveLast的调用可能会触发对BOF / EOF的更新。我想你可能会被迫改编码。

对于踢腿和咯咯笑,试一试(不知道它是否有用):

rset.Delete 
rset.MoveNext
If rset.BOF <> True Or rset.EOF <> True Then                 
    rset.MoveLast               
End If

http://msdn.microsoft.com/en-us/library/ms677527(v=vs.85).aspx

  

使用MoveNext方法移动   目前的记录位置一个记录   向前(朝向底部)   记录)。如果最后一条记录是   当前记录,你打电话给   MoveNext方法,ADO设置当前   记录到最后一个位置   记录在Recordset中(EOF为True)。   试图向前迈进的时候   EOF属性已生成True   错误。