2014-08-28 4 views
13

Ich habe nach einer Möglichkeit zum Kopieren oder Kopieren eines Recordset in VBA gesucht. Und damit meine ich, dass die zugrunde liegenden Daten unabhängig voneinander sind.Deep Copy oder Clone ein ADODB-Recordset in VBA

habe ich versucht

Set copyRS = origRS.Clone 
Set copyRS = origRS 

Wenn ich jede der Methoden I cant einem Cord-modifizieren, ohne die andere zu verändern. So in diesem Beispiel:

  1. ich ein Re-Cord
  2. erstellen bevöl ich das Re-Cord mit dem Namen John
  3. ich das Re-Cord klonen
  4. ich das geklonte ein
  5. Prüfergebnis
ändern

Code:

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) 

Aber leider für mich, dies ändert beiden Cord-Sets

Meine Frage ist:

Gibt es eine Möglichkeit, ein Recordset von einem anderen Recordset zu kopieren und dann die Daten unabhängig voneinander ändern (ohne Looping)?

Ich weiß, dass Sie es offensichtlich durch eine Schleife tun können, aber gibt es keinen anderen Weg?

Antwort

22

++ Gute Frage! übrigens. Diese Art des Kopierens von Objekten wird als deep copy bezeichnet.

Ich komme in der Regel mit der Erstellung eines ADODB.Stream und speichern Sie das aktuelle Recordset in es.

Dann können Sie die .Open() Methode eines neuen Recordset verwenden und den Stream an sie übergeben.

Zum Beispiel:

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 

Ergebnisse wie erwartet:

enter image description here

+1

Brilliant !! Ich habe lange gesucht !! –