私はVBAモジュールに塗りつぶしたADOレコードセットを持っています。また、レコードセットとまったく同じ構造を持つACCESSテーブルもあります。完全なADOレコードセットを既存のACCESSテーブルにループなしで挿入する
ここでは、各データセットレコードを通過するループ(これは問題ありません)を使用してテーブルを埋めます。
私は疑問に思っている:アクセステーブルにレコードセット全体を挿入する方法はありますか? (さらに重要なのは、これはかなり速いでしょう)
私はVBAモジュールに塗りつぶしたADOレコードセットを持っています。また、レコードセットとまったく同じ構造を持つACCESSテーブルもあります。完全なADOレコードセットを既存のACCESSテーブルにループなしで挿入する
ここでは、各データセットレコードを通過するループ(これは問題ありません)を使用してテーブルを埋めます。
私は疑問に思っている:アクセステーブルにレコードセット全体を挿入する方法はありますか? (さらに重要なのは、これはかなり速いでしょう)
ここでは、切断されたレコードセットを使用してレコードを追加する基本的な例を示します(この例では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
ありがとうございます。問題は、ループを使用する必要がなくなり、2つのアクセステーブル(SELECT * INTO SomeTable FROM SomewhereElse)の間で行うことができるように、レコードセット全体をテーブルにダンプする方法でした。 –
私が持っている唯一のループは、テストレコードセットをロードし、更新後の結果を表示することです。データのロードはすべて、1つの 'UpdateBatch'行で行われます。どのようなループを参照していますか? –
私は最も重要な部分を見逃していたことがわかった。しかし、私は今参照してください。それが私が探していたものでした。 –
いいえ逆の同等物はありません - SetRows
- GetRows
になる可能性があります。
VBAレコードセットは、実行時に呼び出されるメモリ内に実質的に存在します。これは、RやPythonのパンダ、SASデータセット、PHP配列、その他のデータ構造のデータフレームに似ています。
CopyFromRecordsetメソッドを使用する形式でADOをExcelスプレッドシートにエクスポートして、csv、txt、xlsx、またはxmlとして保存することを検討してください。また、Saveメソッドを使用して、xmlなどの永続的な形式のレコードセットを保存することもできます。
その後、その自動化されたデータ・マイグレーション機能でMS Accessテーブルに結果ファイルを追加します。
スプレッドシートDoCmd.TransferSpreadsheet
TXT、CSV、またはのためにDoCmd.TransferText
Application.ImportXML
INSERT INTO
SQLクエリADOからExcelへのアクセス。ループしているINSERT文よりも速いでしょう。残念ながら、SELECTステートメントを使用してレコードセット(またはおそらく配列..... ..... Hmm。VALUES)からデータを取ってINSERTをテーブルに書き込むことはできません。 – HarveyFrench
https://support.microsoft.com/en-us/kb/195082では、更新を実行するために切断されたレコードセットを使用しています。挿入についてはわかりません。 –