web-dev-qa-db-ja.com

完全なADO Recordsetを既存のACCESSテーブルにループなしで挿入します

私はVBAモジュールにADOレコードセットを入力しました。また、レコードセットとまったく同じ構造を持つACCESSにテーブルがあります。

次に、各データセットレコードをループする(これで問題ありません)を使用して、テーブルにデータを入力します。

私が思っていること:レコードセット全体をアクセステーブルに挿入する方法はありますか? (そしてより重要なこと:これはかなり速くなるでしょうか)

9

以下は、切断されたレコードセットを使用してレコードを追加する方法を示す基本的な例(この場合はExcelから実行)です。

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
13
Tim Williams

VBAレコードセットは、ハードディスクに保存された実際の物理形式(csv、txt、xlsx、xml、データベース一時テーブル)に含まれるまで、実行時に呼び出されるメモリに仮想的に存在します。これは、RまたはPython pandas、SAS datasets、PHP arrays、and other data structuresのデータフレームに似ています。

ADOを CopyFromRecordset メソッドを使用してこのような形式でExcelスプレッドシートにエクスポートし、csv、txt、xlsx、またはxmlとして保存することを検討してください。あるいは、 Save xmlのような永続的なフォーマットタイプでレコードセットを保存するメソッド。

次に、自動データ移行機能を使用して、結果のファイルをMS Accessテーブルに追加します。

  • スプレッドシートの場合:DoCmd.TransferSpreadsheet
  • Txt、csv、またはその他の区切られたファイルの場合:DoCmd.TransferText
  • XMLファイルの場合:Application.ImportXML
  • ローカルまたはODBC/OLEDBリンクデータベーステーブルの場合:INSERT INTO SQLクエリを追加

2
Parfait

いいえ。メソッドSetRowsに対して、GetRowsになる可能性のある逆の等価物はありません。

0
Gustav