ファイルの共有ロック数が制限を超えています

備忘録記事です。

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

ファイルの共有ロックの制限超えるというのは「エラー回避のためにメモリ上に残しておく制限を超えている」ということのようらしい・・・ので、制限を超える前にそこまで処理したループ分を全部「完了」にしてしまえ、という対処方法。