2014-08-28 135 views
13

我一直在寻找在VBA中复制或复制记录集的方法。我的意思是,让未确定的数据彼此独立。在VBA中深度复制或克隆ADODB记录集

我试图

Set copyRS = origRS.Clone 
Set copyRS = origRS 

当我使用的任何方法我不能修改一个记录,而无需修改其他。因此,在这个例子:

  1. 我创建一个记录
  2. 我填充记录与约翰
  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) 

但不幸的是我,这同时修改的记录

我的问题是:

是否有从另一个记录复制记录的方式,然后彼此独立的修改数据(不包括循环)?

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

回答

22

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

+1

亮!!我一直在寻找这个很长一段时间! – 2014-08-28 18:05:39