Глубокое копирование или клонирование набора записей ADODB в VBA

Я искал способ дублирования или копирования записей в VBA. И под этим я имею в виду, что несмертельные данные независимы друг от друга.

Я пробовал

Set copyRS = origRS.Clone
Set copyRS = origRS

когда я использовать любой из методов, я не могу изменить один набор записей без изменения других. Итак, в этом примере:

  1. Я создаю набор записей
  2. я заполняю набор записей именем John
  3. Я клонирую набор записей
  4. I изменить клонированный
  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)

но, к сожалению для меня, это изменяет оба набора записей

мой вопрос:

есть ли способ скопировать набор записей из другого набора записей, а затем изменить данные независимо друг от друга (без цикла)?

Я знаю, что, очевидно, вы можете сделать это через петлю, но нет ли другого способа?

1 ответов


++ хороший вопрос! кстати. этот способ копирования объекта называется глубокая копия.

обычно мне удается создать 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