Access テーブルに対して操作を実行すると、"ディスク領域またはメモリ不足" エラーが発生する

高度な機能: 高度なコーディング、相互運用性、マルチユーザー スキルが必要です。

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

現象

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

大きなテーブルに対してアクション クエリを実行すると、次のエラー メッセージが表示される場合があります。このアクション クエリで行うデータの変更を元に戻すためのディスク領域またはメモリが不足しています。

原因

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

解決方法

重要

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

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

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

  • Regedit.exe を使用してレジストリを編集し、MaxLocksPerFilevalue を永続的に変更できます。
  • DBEngine オブジェクトの SetOptionmethod を使用して、コード内の MaxLocksPerFilevalue を一時的に変更できます。
  • アクション クエリの実行時にエラーが発生した場合は、クエリを変更し、その UseTransactionproperty を [いいえ] に設定できます。

方法 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 ビット Windows オペレーティング システムで実行されている Microsoft Office Access 2007 の場合:

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

64 ビット Windows オペレーティング システムで実行されている Microsoft Office 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 ビット Windows オペレーティング システムで実行されている Microsoft Office Access 2010 の場合:

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

32 ビット Windows オペレーティング システムで実行されているMicrosoft Access 2013の場合:

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

64 ビット Windows オペレーティング システムで実行されている Microsoft Office Access 2013 の場合:

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 ビット Windows オペレーティング システムで実行されている Microsoft Office Access 2016の場合:

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

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

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

注:

この記事のサンプル コードでは、Microsoft Data Access オブジェクトを使用します。 このコードを正しく実行するには、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 を [いいえ] に設定します。
  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 の FieldSize プロパティを 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.