为啥要克隆 MS-Access 记录集?

Posted

技术标签:

【中文标题】为啥要克隆 MS-Access 记录集?【英文标题】:Why clone an MS-Access recordset?为什么要克隆 MS-Access 记录集? 【发布时间】:2010-03-02 20:04:34 【问题描述】:

我是 VBA 的新手,正在尝试理解别人的代码。

设置 rstClone = Me.RecordsetClone rstClone.MoveFirst

为什么必须克隆记录集?为什么代码不能是 Me.Recordset.MoveFirst?

【问题讨论】:

请注意,.recordsetClone 仅适用于 DAO 记录集。在带有 ADODB 记录集的表单上调用此属性将导致运行时出现错误(尽管在编译时未检测到) 【参考方案1】:

您可能希望使用recordsetclone,因为您不希望影响表单中显示的记录,而me.recordset.movefirst 会这样做。

【讨论】:

【参考方案2】:

首先,记录集没有被克隆——只要有记录源,表单的 Recordsetclone 就存在,即使它不包含任何记录。

其次,recordsetclone 是一个独立的记录集,您可以导航它并且不会影响表单的编辑缓冲区,它具有一组独立的记录指针(即书签)。

也就是说,将记录集变量设置为记录集克隆是毫无意义的。相反,只需使用 WITH 块:

  With Me.RecordsetClone
    .FindFirst "[MyPK]=" & Me!cmbFindByPK
    If Not .NoMatch Then
       If Me.Dirty Then
          Me.Dirty = False
       End If
       Me.Bookmark = .Bookmark
    End If
  End With

使用设置记录集变量的替代方法如下所示:

  Dim rs As DAO.Recordset

  Set rs = Me.RecordsetClone
  rs.FindFirst "[MyPK]=" & Me!cmbFindByPK
  If Not rs.NoMatch Then
     If Me.Dirty Then
        Me.Dirty = False
     End If
     Me.Bookmark = rs.Bookmark
  End If
  Set rs = Nothing

还要注意,从 Access 2000 开始,除了 RecordsetClone 之外,表单还有一个 Recordset 对象。该对象使您可以访问表单的实际编辑缓冲区,并且通过它进行导航会更改表单本身中的记录指针。不过,我会避免使用它,因为间接使用作为相同数据的动态集的单独相同对象似乎是一种有用的保护层,可以防止做不应该做的事情。

【讨论】:

【参考方案3】:

请记住,记录集具有称为克隆方法。这与表单记录集克隆不同。

在您的示例和问题中,我们讨论了表单所基于的基础数据。

如果您打算使用表单所基于的代码浏览记录,但您不希望表单显示或图形界面跟随您或跳来跳去,那么您的示例就是正确且首选的方法来完成此操作。

因此,记录集克隆是表单数据的副本。它允许您移动或遍历该记录集中的记录,但表单(用户界面)不会跟随您在记录中移动。

请记住,在某些情况下,如果您确实希望表单移动到下一条记录,那么您将不会使用记录集克隆,而是使用实际记录集。

例如:

Set rstClone  = me.recordset
rstClone.movenext

在上面,表单将移动到下一条记录。

一个典型的情况是当您使用子表单时。如果您想合计或遍历该子表单中的 10 条记录,您可以这样做,而不会影响或导致子表单当前指向的当前显示记录发生更改。可以这么说,它可以让你在幕后做事。

但是,如果您只是想移动到表单的下一条记录,那么您不需要 reocrdset 或记录集克隆,您只需执行一个将表单移动到下一条记录的命令。

您可以使用以下典型命令:

DoCmd.GoToRecord acActiveDataObject, , acNext

而且,如果您想查看放置在表单中的代码中的值,则不需要记录集或记录集克隆,您可以这样做:

me!nameOfCollumFromTable

【讨论】:

【参考方案4】:

使用记录集属性可能会导致意外行为。具体来说(在 Access 2010 中),如果您引用 me.recordset,它可能会意外地导致表单的编辑缓冲区被保存。

例如:

debug.print me.recordset.recordcount

将导致表单的记录被保存。使用recordsetClone 不会出现这种[错误] 行为。

【讨论】:

以上是关于为啥要克隆 MS-Access 记录集?的主要内容,如果未能解决你的问题,请参考以下文章

记录集到表?

使用 vba 在 MS-Access 前端中来自 MySQL 存储过程的多个结果集?

为啥 ADO 记录集返回的记录比基础 Access 查询多

为啥我的数据库对象没有显示记录集?

提高计算 MS-Access 中大型数据集 7 天滚动平均值的查询的性能

当访问遍历记录集时,它是不是会随着索引的增加而变慢,为啥?