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

Ern*_*roy 13 excel vba adodb recordset excel-vba

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

我试过了

Set copyRS = origRS.Clone
Set copyRS = origRS
Run Code Online (Sandbox Code Playgroud)

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

  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)
Run Code Online (Sandbox Code Playgroud)

但不幸的是,对我来说,这会修改两个记录集

我的问题是:

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

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

小智 25

++好问题!顺便说一句.这种复制对象的方式称为深层复制.

我通常会创建一个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
Run Code Online (Sandbox Code Playgroud)

结果如预期:

在此输入图像描述