Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access DAO中的代码正常,但给出运行时错误';3021&x27;阿多_Ms Access_Vb6_Ado_Dao - Fatal编程技术网

Ms access DAO中的代码正常,但给出运行时错误';3021&x27;阿多

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

在使用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 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-大卫的回答是最好的办法。祝你好运我做了一个与这个问题相关的小发现,你可能会感兴趣,并相应地编辑了这个问题