ファイルの共有ロック数が制限を超えています (Error 3052)レジストリエントリMaxLockPerFileの値を増やして下さい。(#-2147217887)
このようなエラーメッセージが出る場合の対処方法について
調べるとだいたい、下記のような情報が出てきます。
MaxLocksPerFile レジストリ キーを設定して、ファイルごとの最大ロック数を増やす
[スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。
regedit と入力し、[OK] をクリックします。
この解決策は、絶対にやめましょう。この程度のエラーで「regedit」を変更してはいけません。
その次に、出てくる情報は MaxLocksPerFile の値を一時的に変更する方法です。デフォルト値は、9500だったと思います。
下記のような方法で、値を変更することが出来ます。しかし、下記のような対処方法だと15000を超えれば同様のエラーが発生します。
DAO.DBEngine.SetOption dbmaxlocksperfile,15000
この現象は、データベースに変更を加えた時のエラー対応時のロールバック用に 設定されているメモリー値のことで、どれだけの変更処理を記憶して、エラーが発生した時に回復処理をするかを設定している値です。
従って、書込み処理に問題がなければ完全に書き込み処理を完了すればいいわけです。
この書込み処理の完了することを「コミットする」と言います。
下記の例は、書込み処理を開始して5000回書き込んだらコミットする例です。
このようにするとデフォルト値の9500を超えることはありません。
'ADO接続
Set ADB = New ADODB.Connection
ADB.Provider = "Microsoft.Ace.OLEDB.12.0;Data Source=xxxxx.accdb;"
ADB.Open
SQL1 = "SELECT * FROM テーブル ;"
Set ARST1 = New ADODB.Recordset
ARST1.Open SQL1, ADB, adOpenKeyset, adLockOptimistic
If ARST1.RecordCount > 0 Then
ARST1.MoveFirst
wCnt = 0
ADB.BeginTrans
Do Until ARST1.EOF
ARST1.Update "フィールド", -1
wCnt = wCnt + 1
If wCnt > 5000 Then
ADB.CommitTrans
ADB.BeginTrans
wCnt = 0
End If
ARST1.MoveNext
Loop
ADB.CommitTrans
End If
ARST1.Close
Set ARST1 = Nothing
以前、友人に教えたのですが、今日、同様のエラーが発生して、友人のブログを参考にして対処しました。(^^;
ブログに残しておくことは大切です。
その場しのぎの対策ではなく、エラーが発生した場合は、ロールバック処理をしないといけませんね。
Excel Appコミュニティを開設しました
「Excelを活用する」ユーザーで技術情報交換をしながら、システムを内製化しませんか?
興味がある方は、コミュニティに参加してください。