Ms access DAO中的代码正常,但给出运行时错误';3021&x27;阿多
在使用Access 97数据库的VB6项目中用ADO替换DAO后,会发生这种情况 它出现在以下代码段中标记为“Error”的行上:Ms access DAO中的代码正常,但给出运行时错误';3021&x27;阿多,ms-access,vb6,ado,dao,Ms Access,Vb6,Ado,Dao,在使用Access 97数据库的VB6项目中用ADO替换DAO后,会发生这种情况 它出现在以下代码段中标记为“Error”的行上: 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 Th
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
如果rset.BOF为真或rset.EOF为真,则
移动终端
当rset.BOF为True时执行此操作
删除
如果rset.BOF为真或rset.EOF为真,则
此处出现rset.MoveLast错误
如果结束
环
如果结束
运行时错误“3021”导致以下解释:
“EOF或BOF为真,或
当前记录已被删除。
请求的操作需要当前的
记录。”
在删除记录集中的最后一条记录之后,代码的ADO版本中BOF+/-EOF仍然为false,而DAO版本中两者都为true。
如果我像这样修改代码,它就会工作
编辑:以下代码不起作用。当我尝试这个“解决方案”时,所有的记录
已从表中删除,因此绕过了整个块,因此未引发任何错误。很抱歉提供了错误信息。
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
Do While rset.EOF <> True
rset.Delete
rset.MoveFirst
Loop
如果rset.BOF为真或rset.EOF为真,则
移动终端
当rset.BOF为True时执行此操作
删除
如果rset.BOF为真或rset.EOF为真,则
如果结束
如果rset.BOF为真或rset.EOF为真,则
移动终端
如果结束
环
如果结束
有人能解释一下吗?(理想情况下,提供一个不涉及更改代码的解决方案!)
进一步编辑:据我所知,已经尝试了很多方法,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
如果rset.BOF为真或rset.EOF为真,则
当rset.RecordCount>0时执行此操作
移动终端
删除
环
如果结束
编辑(1个月后)
所以在重写了一堆代码之后,我遇到了一个循环,其中包含一个没有给出错误的delete。唯一的区别是,该循环每次都删除记录集中的第一条记录,而不是最后一条记录,因此每次删除后都会执行该循环
先走一步而不是最后一步。
因此,我尽可能地缩减了代码,下面的代码片段在Postgresql和Access上都很好地工作,这两个数据库是我使用ADO在VB6上尝试的。
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
Do While rset.EOF <> True
rset.Delete
rset.MoveFirst
Loop
Do While rset.EOF True
删除
rset.MoveFirst
环
删除最终记录后,EOF和BOF仍然为false,但调用MOVEFIRST方法不会出现错误。调用MOVEFIRST现在将EOF和BOF都设置为true,循环退出。
相反,如果MOVEFIRST方法替换为MOVELAST,则两个数据库上都会发生(3021)错误。
rskar在回答时引用了MSDN的这一点
使用MoveNext方法来移动
当前记录位置1记录
向前(朝向底部)
记录集)。如果最后一条记录是
当前记录,然后调用
在MoveNext方法中,ADO设置当前
记录到最后一次之后的位置
记录集中的记录(EOF为真)。
试图在
EOF属性已为True
一个错误
他们提到MOVENEXT会导致错误,我想既然MOVELAST是朝同一方向移动,这就解释了为什么它也会导致错误。
我只是希望我没有假设所有的移动方法都会导致类似的问题参见:
如果删除最后一个剩余的
记录集对象中的记录
BOF和EOF性能可能保持不变
在尝试重新定位之前为False
当前记录
因为ADO不是DAO,所以行为上的差异应该不会太令人惊讶。调用MoveLast可能会触发对BOF/EOF的更新。我想你可能会被迫改变编码
对于踢腿和咯咯笑,尝试一下(不知道是否有效):
rset.Delete
rset.MoveNext
如果rset.BOF为真或rset.EOF为真,则
移动终端
如果结束
Per:
使用MoveNext方法来移动
当前记录位置1记录
向前(朝向底部)
记录集)。如果最后一条记录是
当前记录,然后调用
在MoveNext方法中,ADO设置当前
记录到最后一次之后的位置
记录集中的记录(EOF为真)。
试图在
EOF属性已为True
一个错误
你到底为什么要通过遍历记录集而不是发出SQL DELETE语句来进行删除?也许是因为他认为他可以自由使用记录集对象的DELETE方法?@Phillipe!多年来,它一直做得很好,直到我试着从道转到ADO为止。@David当时,这是我知道如何做的唯一方法。你建议的方法是我怎么做now@Philippe:.Delete方法不起作用。您只需要知道如何适当地使用记录集对象的其他属性。感谢您的解释。不幸的是,rset.movenext似乎不起作用,将抛出相同的错误。事实上,我认为我的解决方案也是如此。我编辑了这个问题以反映这一点。我认为有必要按照David-W-Fenton在问题评论中建议的思路进行改写。@jjb-大卫的回答是最好的办法。祝你好运我做了一个与这个问题相关的小发现,你可能会感兴趣,并相应地编辑了这个问题