2014-08-28 1 views
13

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

Я попытался

Set copyRS = origRS.Clone 
Set copyRS = origRS 

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

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

Блестящая !! Я искал это в течение долгого времени! –

 Смежные вопросы

  • Нет связанных вопросов^_^