備忘録記事です。
AccessのVBAでADOレコードセットを使用し、ループ処理で大量のレコードの更新を行うと「ファイルの共有ロック数が制限を超えています(Error 3052)レジストリエントリMaxLockPerFileの値を増やして下さい。」というエラーが出てくることがあります。
対処方法
エラーメッセージに従ってレジストリをいじるとか、そういうのだと使うPCを変えた場合などに面倒そうなので、あくまで当該Accessのファイル内だけで対処をしたい・・・ので、以下のように対処する。(制限を超える前に書き込み処理を完了すれば良い)
’ADODB接続
Dim pLngCNT as Long
Set Cn = New ADODB.Connection
pStrSQL="SELECT * FROM テーブル;"
Set MyRS =New ADODB.Recordset
MyRS.Open pStrSQL,CN,adOpenKeyset,adLockOptimistic
if MyRS.RecordCOunt=0 then Exit sub
pMyRS.MoveFirst
pLngCNT=0
Cn.BeginTrans '・・・・ここでBeginTransをしておく
Do Until MyRS.EOF
MyRS.Fields("フィールド").Value=2
pLngCNT=pLngCNT+1
If pLngCNT > 1000 Then '・・・カウンタが1000を超えてたらComitTransして再びBeginTransする
Cn.CommitTrans
Cn.BeginTrans
pLngCNT=0
end if
MyRS.MoveNext
Loop
ファイルの共有ロックの制限超えるというのは「エラー回避のためにメモリ上に残しておく制限を超えている」ということのようらしい・・・ので、制限を超える前にそこまで処理したループ分を全部「完了」にしてしまえ、という対処方法。
