2014-08-28 18 views
13

Ho cercato un modo per duplicare o copiare un recordset in VBA. E con questo intendo, avere i dati immeritevoli indipendenti l'uno dall'altro.Deep Copy o Clona un recordset ADODB in VBA

Ho provato

Set copyRS = origRS.Clone 
Set copyRS = origRS 

Quando uso qualsiasi dei metodi smusso modificare uno recordset senza modificare l'altro. Quindi in questo esempio:

  1. creo un set di record
  2. Io popolo il set di record con il nome di Giovanni
  3. clono il set di record
  4. ho modificare il clonato un
  5. check risultato

Codice:

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) 

Ma purtroppo per me, Questo modifica entrambi i set di record

La mia domanda è:

C'è un modo di copia di un set di record da un altro set di record e quindi modificare i dati in modo indipendente l'uno dall'altro (senza loop)?

So che evidentemente puoi farlo attraverso un ciclo, ma non c'è altro modo?

risposta

22

++ Buona domanda! btw. questo modo di copiare oggetti è chiamato deep copy.

Generalmente riesco a creare un ADODB.Stream e salvare il recordset corrente su di esso.

Quindi è possibile utilizzare il metodo .Open() di un nuovo recordset e passare il flusso ad esso.

Ad esempio:

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 

Risultati come previsto:

enter image description here

+1

Brilliant !! Sono stato alla ricerca di questo per molto tempo !! –

Problemi correlati