2014-08-28 15 views
13

Tôi đã tìm kiếm cách sao chép hoặc sao chép bản ghi trong VBA. Và ý tôi là, có những dữ liệu vô tình độc lập với nhau.Sao chép sâu hoặc sao chép bản ghi ADODB trong VBA

Tôi đã thử

Set copyRS = origRS.Clone 
Set copyRS = origRS 

Khi tôi sử dụng bất kỳ phương pháp tôi không thể thay đổi một recordset mà không sửa đổi khác. Vì vậy, trong ví dụ này:

  1. tôi tạo một recordset
  2. tôi cư recordset với tên John
  3. tôi sao chép recordset
  4. tôi thay đổi nhân bản một
  5. Kiểm tra kết quả

Mã:

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) 

Nhưng không may cho tôi, đây sẽ thay đổi cả bản ghi

Câu hỏi của tôi là:

Có cách nào sao chép một recordset từ recordset khác và sau đó sửa đổi dữ liệu độc lập với nhau (không vòng lặp)?

Tôi biết rõ ràng là bạn có thể làm điều đó thông qua một vòng lặp, nhưng không có cách nào khác?

Trả lời

22

++ Câu hỏi hay! btw. cách sao chép đối tượng này được gọi là deep copy.

Tôi thường tránh xa việc tạo một ADODB.Stream và lưu bản ghi hiện tại vào đó.

Sau đó, bạn có thể sử dụng phương thức .Open() của bản ghi mới và chuyển luồng đó tới đó.

Ví dụ:

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 

Kết quả như mong đợi:

enter image description here

+1

Brilliant !! Tôi đã tìm kiếm điều này trong một thời gian dài !! –

Các vấn đề liên quan