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 に設定できます。 これを行うと、クエリの実行中に問題やエラーが発生した場合、変更をロールバックできないことに注意してください。
- デザイン ビューでクエリを開きます。
- [表示] メニューの [プロパティ] をクリックします。
- クエリ ウィンドウの上半分にある空の領域をクリックして、[クエリのプロパティ] ダイアログ ボックスを表示します。
- UseTransactionproperty を [いいえ] に設定します。
- クエリを保存して閉じます。
詳細
レジストリの MaxLocksPerFilesetting は、Microsoft Jet データベース エンジンのトランザクションが指定した値を超えないようにします。 トランザクションが MaxLocksPerFile 値を超えるロックを作成しようとすると、トランザクションは 2 つ以上の部分に分割され、部分的にコミットされます。
問題の再現手順
次の例では、Visual Basic プロシージャを使用して、10,000 個のレコードを含むテーブルを作成し、エラー メッセージを発生させるためにテーブルを変更します。
- サンプル データベース Northwind.mdbを開きます。
- モジュールを作成し、次の手順を入力します。
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
プロシージャを実行するには、[イミディエイト] ウィンドウに次の行を入力し、Enter キーを押します。
CreateBigTable
プロシージャは、10,000 個のレコードを含む BigTable という名前のテーブルを作成します。
モジュールを Module1 として保存し、閉じます。
デザイン ビューで BigTable テーブルを開きます。
Field4 の FieldSize プロパティを 253 に変更します。
テーブルを保存します。 一部のデータが失われる可能性があることを確認するメッセージが表示されたら、[はい] をクリックします。
しばらくすると、次のエラー メッセージが表示されることに注意してください。
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.
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示