2015-09-28 91 views
5

私はVBAモジュールに塗りつぶしたADOレコードセットを持っています。また、レコードセットとまったく同じ構造を持つACCESSテーブルもあります。完全なADOレコードセットを既存のACCESSテーブルにループなしで挿入する

ここでは、各データセットレコードを通過するループ(これは問題ありません)を使用してテーブルを埋めます。

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

+0

https://support.microsoft.com/en-us/kb/195082では、更新を実行するために切断されたレコードセットを使用しています。挿入についてはわかりません。 –

答えて

6

ここでは、切断されたレコードセットを使用してレコードを追加する基本的な例を示します(この例ではExcelから実行します)。それらはハードディスクに保存された実際の物理フォーマット(即ち、CSV、TXT、XLSX、XML、データベースの一時テーブル)に含まれるまで

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

ありがとうございます。問題は、ループを使用する必要がなくなり、2つのアクセステーブル(SELECT * INTO SomeTable FROM SomewhereElse)の間で行うことができるように、レコードセット全体をテーブルにダンプする方法でした。 –

+0

私が持っている唯一のループは、テストレコードセットをロードし、更新後の結果を表示することです。データのロードはすべて、1つの 'UpdateBatch'行で行われます。どのようなループを参照していますか? –

+0

私は最も重要な部分を見逃していたことがわかった。しかし、私は今参照してください。それが私が探していたものでした。 –

0

いいえ逆の同等物はありません - SetRows - GetRowsになる可能性があります。

1

VBAレコードセットは、実行時に呼び出されるメモリ内に実質的に存在します。これは、RやPythonのパンダ、SASデータセット、PHP配列、その他のデータ構造のデータフレームに似ています。

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

その後、その自動化されたデータ・マイグレーション機能でMS Accessテーブルに結果ファイルを追加します。

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

+0

ADOからExcelへのアクセス。ループしているINSERT文よりも速いでしょう。残念ながら、SELECTステートメントを使用してレコードセット(またはおそらく配列..... ..... Hmm。VALUES)からデータを取ってINSERTをテーブルに書き込むことはできません。 – HarveyFrench

関連する問題