在VBA中深层复制或克隆ADODB记录集

时间:2014-08-28 16:24:37

标签: excel vba excel-vba adodb recordset

我一直在寻找一种在VBA中复制或复制记录集的方法。我的意思是,让不正确的数据相互独立。

我试过了

Set copyRS = origRS.Clone
Set copyRS = origRS

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

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

    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)
    

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

    我的问题是:

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

    我知道显然你可以通过一个循环来完成它,但没有别的办法吗?

1 个答案:

答案 0 :(得分:24)

++好问题!顺便说一句。这种复制对象的方式称为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

预期结果:

enter image description here