2015-09-28 18 views
5

Tôi có một bản ghi ADO đầy trong mô-đun VBA của tôi. Tôi cũng có một bảng trong ACCESS có cấu trúc chính xác giống như recordset.chèn đầy đủ ADO Recordset vào bảng ACCESS hiện tại KHÔNG CÓ LOOP

Bây giờ tôi điền vào bảng bằng cách sử dụng một vòng lặp (mà là tốt) đi qua mỗi bản ghi số liệu.

Điều tôi thắc mắc: có cách nào để chèn toàn bộ bản ghi vào bảng truy cập không? (và quan trọng hơn: điều này sẽ nhanh hơn đáng kể)

+0

https://support.microsoft.com/en-us/kb/195082 cho thấy việc sử dụng bản ghi đã bị ngắt kết nối để thực hiện cập nhật: không chắc chắn về việc chèn ... –

Trả lời

6

Dưới đây là một ví dụ cơ bản (chạy từ excel trong trường hợp này) minh họa bằng cách sử dụng một recordset bị ngắt kết nối để thêm bản ghi.

Sub Tester() 

    Dim con As ADODB.Connection, rs As ADODB.Recordset 
    Dim i As Long 

    Set con = getConn() 

    Set rs = New ADODB.Recordset 
    rs.CursorLocation = adUseClient '<<<< important! 

    'get an empty recordset to add new records to 
    rs.Open "select * from Table1 where false", con, _ 
      adOpenDynamic, adLockBatchOptimistic 

    'disconnect the recordset and close the connection 
    Set rs.ActiveConnection = Nothing 
    con.Close 
    Set con = Nothing 

    'add some new records to our test recordset 
    For i = 1 To 100 
     rs.AddNew 
     rs("UserName") = "Newuser_" & i 
    Next i 

    'reconnect to update 
    Set con = getConn() 
    Set rs.ActiveConnection = con 

    rs.UpdateBatch '<<< transfer to DB happens here: no loop! 

    rs.Close 

    'requery to demonstrate insert was successful 
    rs.Open "select * from Table1", con, _ 
      adOpenDynamic, adLockBatchOptimistic 

    Do While Not rs.EOF 
     Debug.Print rs("ID").Value, rs("UserName").Value 
     rs.MoveNext 
    Loop 

    rs.Close 
    con.Close 
End Sub 

Function getConn() As ADODB.Connection 
    Dim rv As New ADODB.Connection 
    Dim strConn As String 

    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" _ 
    & "Data Source = " & ThisWorkbook.Path & "\Test.accdb" 

    rv.Open strConn 
    Set getConn = rv 
End Function 
+0

cảm ơn, tôi sử dụng một cái gì đó tương tự. Câu hỏi là làm thế nào để tránh phải sử dụng một vòng lặp, và chỉ cần đổ toàn bộ recordset vào bảng như bạn có thể làm giữa hai bảng truy cập (SELECT * INTO SomeTable FROM SomewhereElse) Nhưng hữu ích dù sao đi nữa! –

+0

Các vòng duy nhất tôi có là để tải bản ghi thử nghiệm và hiển thị kết quả sau khi cập nhật. Dữ liệu tải tất cả xảy ra trong dòng 'UpdateBatch' duy nhất. Bạn đang đề cập đến vòng lặp nào? –

+0

Rất tiếc, tôi nhận ra rằng tôi đã bỏ lỡ phần quan trọng nhất. Nhưng tôi thấy bây giờ. Đó là những gì tôi đã hy vọng tìm thấy. Cảm ơn rất hữu ích vì đã làm rõ –

0

Không. Không có tương đương ngược - có thể là SetRows - với phương thức GetRows.

1

VBA Recordsets tồn tại hầu như trong ký ức gọi trong thời gian chạy cho đến khi họ được chứa vào một định dạng vật lý thực tế (ví dụ, csv, txt, xlsx, xml, cơ sở dữ liệu tạm thời bảng) lưu vào đĩa cứng. Điều này tương tự như các khung dữ liệu trong R hoặc Python pandas, SAS datasets, mảng PHP và các cấu trúc dữ liệu khác.

Xem xét xuất ADO của bạn ở định dạng như vậy bằng cách sử dụng các phương pháp CopyFromRecordset vào bảng tính Excel để lưu dưới dạng csv, txt, xlsx hoặc xml. Ngoài ra, bạn có thể sử dụng phương thức Save để lưu bản ghi trong loại định dạng liên tục như xml.

Sau đó, thêm tập tin kết quả để MS Access bảng với các tính năng di chuyển dữ liệu tự động của nó:

  • Đối với bảng tính: DoCmd.TransferSpreadsheet
  • Đối txt, csv, hoặc các tập tin khác được phân định: DoCmd.TransferText
  • Đối với file xml : Application.ImportXML
  • Đối với bảng cơ sở dữ liệu được liên kết hoặc ODBC/OLEDB được liên kết: INSERT INTO nối truy vấn SQL

+0

ADO để Excel truy cập. Âm thanh như nó sẽ nhanh hơn câu lệnh INSERT lặp. Thật đáng tiếc là bạn không thể viết một câu lệnh SQL INSERTS vào bảng bằng cách sử dụng câu lệnh SELECT lấy dữ liệu từ một recordset (hoặc có lẽ là một mảng ..... Hmm. VALUES ... – HarveyFrench

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