我一直在寻找一种在VBA中复制或复制记录集的方法。我的意思是说,拥有不变的数据是彼此独立的。

我努力了

Set copyRS = origRS.Clone
Set copyRS = origRS


当我使用任何一种方法时,都无法修改一个记录集而不修改另一个记录集。因此,在此示例中:


我创建一个记录集
我用约翰名字填充记录集
我克隆记录集
我修改克隆的
检查结果


码:

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)


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

我的问题是:

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

我知道您显然可以通过循环来完成此操作,但是没有其他方法吗?

最佳答案

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


预期结果:

关于excel - 在VBA中深度复制或克隆ADODB记录集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25553594/

10-10 19:00