【问题标题】:Deep Copy or Clone an ADODB recordset in VBA在 VBA 中深度复制或克隆 ADODB 记录集
【发布时间】:2014-10-22 14:22:17
【问题描述】:

我一直在寻找一种在 VBA 中复制或复制记录集的方法。我的意思是,让基础数据彼此独立。

我试过了

Set copyRS = origRS.Clone
Set copyRS = origRS

当我使用任何一种方法时,我都无法在不修改另一个记录集的情况下修改一个记录集。所以在这个例子中:

  1. 我创建了一个记录集
  2. 我用名称 John 填充记录集
  3. 我克隆了记录集
  4. 我修改了克隆的
  5. 检查结果

代码:

Dim origRS As Recordset, copyRS As Recordset
Set origRS = New Recordset
'Create field
origRS.Fields.Append "Name", adChar, 10, adFldUpdatable
origRS.Open
'Add name
origRS.AddNew "Name", "John"
'Clone/copy
Set copyRS = origRS.Clone
'Change record in cloned/copied recordset
copyRS.MoveFirst
copyRS!Name = "James"
'This should give me "JamesJohn"
MsgBox copyRS.Fields(0).Value & origRS.Fields(0)

但不幸的是,这会修改两个记录集

我的问题是:

有没有办法从另一个记录集中复制一个记录集,然后相互独立地修改数据(不循环)?

我知道显然你可以通过循环来做到这一点,但是没有别的办法吗?

【问题讨论】:

    标签: vba excel adodb recordset


    【解决方案1】:

    ++ 好问题!顺便提一句。这种复制对象的方式称为deep copy

    我通常会创建一个ADODB.Stream 并将当前记录集保存到其中。

    然后您可以使用新记录集的.Open() 方法并将流传递给它。

    例如:

    Sub Main()
    
        Dim rs As ADODB.Recordset
        Set rs = New ADODB.Recordset
    
        rs.Fields.Append "Name", adChar, 10, adFldUpdatable
        rs.Open
        rs.AddNew "Name", "John"
    
        Dim strm As ADODB.Stream
        Set strm = New ADODB.Stream
    
        rs.Save strm
    
        Dim copy As New ADODB.Recordset
        copy.Open strm
    
        copy!Name = "hellow"
    
        Debug.Print "orignal recordset: " & rs.Fields(0).Value
        Debug.Print "copied recordset: " & copy.Fields(0).Value
    
        strm.Close
        rs.Close
        copy.Close
    
        Set strm = Nothing
        Set rs = Nothing
        Set copy = Nothing
    
    End Sub
    

    结果如预期:

    【讨论】:

    • 太棒了!!这个我找了好久!!
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2020-03-04
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多