Access テーブルで操作を実行すると、"ディスク領域またはメモリが足りない" というエラーが発生する

注意

Office 365 用リソース は、 エンタープライズ向け Microsoft 365 アプリに名前変更されています。 この変更の詳細については、 このブログの投稿を参照してください。

Advanced: 専門的なコーディング、相互運用性、およびマルチユーザースキルが必要です。

この記事は、Microsoft Access データベース (.mdb) にのみ適用されます。

現象

テーブルに対して操作を実行すると、多数のページ ロックが作成された場合に、次のエラー メッセージが表示されることがあります。ディスク領域やメモリが十分ではありません。

大規模なテーブルでアクション クエリを実行すると、次のエラー メッセージが表示される場合があります。このアクション クエリが行うデータ変更を元に戻すには十分なディスク領域やメモリはありません。

原因

トランザクションに必要なページ ロックが MaxLocksPerFile 値を超え、既定値は 9500 ロックです。 MaxLocksPerFilesetting は Windows レジストリに格納されます。

解決方法

重要

このセクション、方法、またはタスクには、レジストリの編集方法が記載されています。 レジストリを誤って変更すると、深刻な問題が発生することがあります。 レジストリを変更する際には十分に注意してください。 保護を強化するため、レジストリを変更する前にレジストリをバックアップします。 こうしておけば、問題が発生した場合にレジストリを復元できます。 レジストリをバックアップおよび復元する方法の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を表示します。

322756 Windows でレジストリをバックアップおよび復元する方法

この問題を回避するには、いくつかの方法があります。

  • レジストリを編集Regedit.exe MaxLocksPerFilevalue を完全に変更するには、このプロパティを使用します。
  • DBEngine オブジェクトの SetOptionmethod を使用して、コード内で MaxLocksPerFilevalue を一時的に変更できます。
  • アクション クエリの実行時にエラーが発生した場合は、クエリを変更し、UseTransactionproperty を No に設定できます。

方法 1: レジストリで MaxLocksPerFile を変更する

レジストリ エディターを使用して、次のキーで MaxLocksPerFile 値を増やします。

Microsoft Access 2000、Microsoft Access 2002、および 32 ビット Windows オペレーティング システムで実行されている Microsoft Office Access 2003 の場合:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet 4.0

Microsoft Access 2000、Microsoft Access 2002、および 64 ビット Windows オペレーティング システムで実行されている Microsoft Office Access 2003 の場合:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Jet 4.0

32 Microsoft Office Windows オペレーティング システムで実行されている Access 2007 の場合は、次の操作を行います。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\ACE

64 Microsoft Office Windows オペレーティング システムで実行されている Access 2007 の場合は、次の操作を行います。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\ACE

32 ビット Windows オペレーティング システムで実行されている Microsoft Access 2010 の場合は、次の操作を行います。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ACE

64 Microsoft Office Windows オペレーティング システムで実行されている Access 2010 の場合は、次の操作を行います。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ACE

32 Access 2013 Windows オペレーティング システムで実行されている Microsoft の場合は、次の操作を実行します。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\Access Connectivity Engine\Engines\ACE

64 Microsoft Office Access 2013 Windows オペレーティング システムで実行されている場合は、次の操作を行います。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines\ACE

32 ビット Windows オペレーティング システムで実行されている Microsoft Access 2016 の場合は、次の操作を行います。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE

64 Microsoft Office Windows オペレーティング システムで実行されている Access 2016 の場合は、次の操作を行います。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE

この メソッドは、Microsoft Jet データベース エンジン バージョン 4.0 を使用しているすべてのアプリケーションのレジストリ設定を変更します。

方法 2: SetOption を使用して MaxLocksPerFile を一時的に変更する

注意

この記事のサンプル コードでは、Microsoft データ アクセス オブジェクトを使用します。 このコードを正しく実行するには、Microsoft DAO 3.6 オブジェクト ライブラリを参照する必要があります。 これを行うには、Visual Basic エディターの [ツール] メニューの [参照] をクリックし、[Microsoft DAO 3.6 オブジェクト ライブラリ] チェック ボックスがオンに設定されている必要があります。

Microsoft は、例示のみを目的としてプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。 これには、市販性または特定の目的との適合性についての黙示の保証も含まれますが、これに限定はされません。 この記事は、説明されているプログラミング言語、手順を作成およびデバッグするために使用されているツールに読者が精通していることを前提にしています。 マイクロソフト サポート窓口では、特定のプロシージャの機能説明に関するご質問に対して支援いたしますが、本例を特定の目的を満たすために機能を追加したり、プロシージャを構築することは行いません。 SetOptionmethod は、レジストリ内の Microsoft Jet データベース エンジン キーの値を一時的に上書きします。 新しい値は、もう一度変更するまで、または DBEngine オブジェクトが閉じるまで有効です。

注意

SetOption メソッドを使用して MaxLocksPerFilesetting に加えた変更は、データ アクセス オブジェクト (DAO) の現在のセッションでのみ使用できます。 Microsoft Access ユーザー インターフェイスを介して実行されるクエリは、レジストリの設定を引き続き使用します。

次のコード サンプルでは、MaxLocksPerFile を 200,000 に設定してから、トランザクション内で更新操作を実行します。

Sub LargeUpdate()
   On Error GoTo LargeUpdate_Error
   Dim db As DAO.Database, ws As DAO.Workspace

' Set MaxLocksPerFile.
   DBEngine.SetOption dbMaxLocksPerFile, 200000

Set db = CurrentDb
   Set ws = Workspaces(0)

' Perform the update.
   ws.BeginTrans
   db.Execute "UPDATE BigTable SET Field1 = 'Updated Field'", _
         dbFailOnError

ws.CommitTrans

db.Close
   MsgBox "Done!"
   Exit Sub

LargeUpdate_Error:
   MsgBox Err & " " & Error
   ws.Rollback
   MsgBox "Operation Failed - Update Canceled"
   End Sub

方法 3: アクション クエリで UseTransaction プロパティを設定する

保存されたアクション クエリでエラーが発生した場合は、UseTransaction プロパティを No に設定できます。 これを行う場合、クエリの実行中に問題やエラーが発生した場合は、変更をロールバックできないことに注意してください。

  1. デザイン ビューでクエリを開きます。
  2. [表示] メニューの [プロパティ] をクリックします。
  3. クエリ ウィンドウの上半分の空き領域をクリックして、[クエリのプロパティ] ダイアログ ボックスを表示します。
  4. UseTransactionproperty を No に設定します。
  5. クエリを保存して閉じます。

詳細情報

レジストリ内の MaxLocksPerFilesetting では、Microsoft Jet データベース エンジン内のトランザクションが指定した値を超えるのを防ぐ。 トランザクションが MaxLocksPerFile 値を超えるロックを作成しようとすると、トランザクションは 2 つ以上の部分に分割され、部分的にコミットされます。

問題を再現する手順

次の例では、Visual Basic プロシージャを使用して 10,000 レコードを含むテーブルを作成し、エラー メッセージを発生するためにテーブルを変更します。

  1. サンプル データベース Northwind.mdb を開きます。
  2. モジュールを作成し、次の手順を入力します。
Sub CreateBigTable()
   Dim db As Database, rs As Recordset
   Dim iCounter As Integer, strChar As String
   Set db = CurrentDb
   db.Execute "CREATE TABLE BigTable (ID LONG, Field1 TEXT(255), " & _
     "Field2 TEXT(255), Field3 TEXT(255), Field4 TEXT(255))", _
     dbFailOnError
   Set rs = db.OpenRecordset("BigTable", dbOpenDynaset)
   iCounter = 0
   strChar = String(255, " ")
   While iCounter <= 10000
      rs.AddNew
      rs!ID = iCounter
      rs!Field1 = strChar
      rs!Field2 = strChar
      rs!Field3 = strChar
      rs!Field4 = strChar
      rs.Update
      iCounter = iCounter + 1
   Wend
   MsgBox "Done!"
End Sub

  1. プロシージャを実行するには、[イミディエイト] ウィンドウに次の行を入力し、Enter キーを押します。

    CreateBigTable
    

    このプロシージャは、10,000 レコードを含む BigTable というテーブルを作成します。

  2. モジュールを Module1 として保存し、閉じます。

  3. デザイン ビューで BigTable テーブルを開きます。

  4. Field4 の FieldSizeproperty を 253 に変更します。

  5. テーブルを保存します。 一部のデータが失われる可能性があるというメッセージが表示されたら、[はい] をクリックします。

    しばらくすると、次のエラー メッセージが表示されます。

    Microsoft Access can't change the data type.
    There isn't enough disk space or memory.  
    
    Errors were encountered during the save operation. Data types were not changed. Properties were not updated.