コード解説

【Access VBA】大量のレコードをINSERTする方法

 

実際の開発現場でどうしてもAccess を使用しなければいけない場面がありますよね。

私も実際にエンジニアとして働いていて、Access を使用しなければいけない場面がありました。

しかもなんと100万件以上のデータをINSERTしなければいけませんでした。。。

そしてやっかいなことに通常のINSERT処理だと「ファイルの共有ロック数が制限を超えています(エラー3052)レジストリエントリMaxLockPerFileの値を増やしてください。(#-2147217887)」というエラーが出てしまい実行ができないんですよね。。。

そんな時に試した方法が下記のコードになります。
この方法だとエラーを回避してINSERT処理を行うことができたんですよね。

↓↓↓

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sql As String
Dim insertSql As String Dim batchSize As Long Dim i As Long Dim counter As Long Set db = CurrentDb Set rs = db.OpenRecordset("SELECT * FROM テーブル名") ' 挿入元のテーブル batchSize = 1000 ' 1000件ごとに分割してINSERT
' 事前にINSERT文を作成 sql = "INSERT INTO テーブル名(カラム名1, カラム名2, カラム名3) VALUES " counter = 0 Do While Not rs.EOF ' 1件ずつINSERT文を作成
insertSql = "" insertSql = insertSql & "('" & rs!Field1 & "', '" & rs!Field2 & "', '" & rs!Field3 & "')" counter = counter + 1

' クエリを実行 db.Execute sql & insertSql
' バッチサイズに達したらクエリを実行 If counter Mod batchSize = 0 Then db.BeginTrans ' トランザクションを開始 db.CommitTrans ' トランザクションをコミット End If rs.MoveNext Loop ' 最後のバッチが残っていたら実行 If counter Mod batchSize <> 0 Then db.BeginTrans ' トランザクションを開始 db.CommitTrans ' トランザクションをコミット End If rs.Close Set rs = Nothing Set db = Nothing

 

このような形で無事にINSERT処理ができるはずです。
是非試してみてください!

-コード解説