Глубокое копирование или клонирование набора записей ADODB в VBA
Я искал способ дублирования или копирования записей в VBA. И под этим я имею в виду, что несмертельные данные независимы друг от друга.
Я пробовал
Set copyRS = origRS.Clone
Set copyRS = origRS
когда я использовать любой из методов, я не могу изменить один набор записей без изменения других. Итак, в этом примере:
- Я создаю набор записей
- я заполняю набор записей именем John
- Я клонирую набор записей
- I изменить клонированный
- в результате проверки
код:
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
результаты: