在使用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在同一方向上运动,这就解释了为什么它也会导致错误。 我只是希望我没有假设所有的移动方法都会导致类似的问题
答案 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 错误。