実際の開発現場でどうしても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処理ができるはずです。
是非試してみてください!