Fehler "Es ist nicht genügend Speicherplatz oder Arbeitsspeicher vorhanden" beim Ausführen eines Vorgangs für eine Access-Tabelle

Erweitert: Erfordert Expertenkenntnisse für Codierung, Interoperabilität und Mehrbenutzerfähigkeiten.

Dieser Artikel gilt nur für eine Microsoft Access-Datenbank (.mdb).

Symptome

Wenn Sie einen Vorgang für eine Tabelle ausführen, erhalten Sie möglicherweise die folgende Fehlermeldung, wenn durch den Vorgang eine große Anzahl von Seitensperren erstellt wird: Es ist nicht genügend Speicherplatz oder Arbeitsspeicher vorhanden.

Wenn Sie eine Aktionsabfrage für eine große Tabelle ausführen, erhalten Sie möglicherweise die folgende Fehlermeldung: Es ist nicht genügend Speicherplatz oder Arbeitsspeicher vorhanden, um die Datenänderungen rückgängig zu machen, die diese Aktionsabfrage vornehmen wird.

Ursache

Die für die Transaktion erforderlichen Seitensperren überschreiten den MaxLocksPerFile-Wert, der standardmäßig auf 9500 Sperren festgelegt ist. MaxLocksPerFilesetting wird in der Windows-Registrierung gespeichert.

Lösung

Wichtig

Dieser Abschnitt, diese Methode bzw. diese Aufgabe enthält eine Beschreibung der Schritte zum Bearbeiten der Registrierung. Durch die falsche Bearbeitung der Registrierung können schwerwiegende Probleme verursacht werden. Daher ist es wichtig, bei der Ausführung der folgenden Schritte sorgfältig vorzugehen. Für zusätzlichen Schutz sichern Sie die Registrierung, bevor Sie sie ändern. Sie können die Registrierung wiederherstellen, wenn ein Problem auftritt. Weitere Informationen zum Erstellen und Wiederherstellen einer Sicherungskopie der Registrierung finden Sie im folgenden Artikel der Microsoft Knowledge Base:

322756 Sichern und Wiederherstellen der Registrierung in Windows

Es gibt mehrere Möglichkeiten, dieses Problem zu umgehen:

  • Sie können Regedit.exe verwenden, um die Registrierung zu bearbeiten und den MaxLocksPerFile-Wert dauerhaft zu ändern.
  • Sie können die SetOption-Methode des DBEngine-Objekts verwenden, um den MaxLocksPerFile-Wert vorübergehend im Code zu ändern.
  • Wenn der Fehler beim Ausführen einer Aktionsabfrage auftritt, können Sie die Abfrage ändern und ihre UseTransactioneigenschaft auf Nein festlegen.

Methode 1: Ändern von MaxLocksPerFile in der Registrierung

Verwenden Sie Registry Editor, um den MaxLocksPerFile-Wert unter dem folgenden Schlüssel zu erhöhen:

Für Microsoft Access 2000, in Microsoft Access 2002 und in Microsoft Office Access 2003, die unter einem 32-Bit-Windows-Betriebssystem ausgeführt werden:

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

Für Microsoft Access 2000, in Microsoft Access 2002 und in Microsoft Office Access 2003, die unter einem 64-Bit-Windows-Betriebssystem ausgeführt werden:

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

Für Microsoft Office Access 2007, das unter einem 32-Bit-Windows-Betriebssystem ausgeführt wird:

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

Für Microsoft Office Access 2007, das unter einem 64-Bit-Windows-Betriebssystem ausgeführt wird:

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

Für Microsoft Access 2010, die unter einem 32-Bit-Windows-Betriebssystem ausgeführt wird:

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

Für Microsoft Office Access 2010, das unter einem 64-Bit-Windows-Betriebssystem ausgeführt wird:

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

Für Microsoft Access 2013, die unter einem 32-Bit-Windows-Betriebssystem ausgeführt wird:

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

Für Microsoft Office Access 2013, das unter einem 64-Bit-Windows-Betriebssystem ausgeführt wird:

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

Für Microsoft Access 2016, die unter einem 32-Bit-Windows-Betriebssystem ausgeführt wird:

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

Für Microsoft Office Access 2016, die unter einem 64-Bit-Windows-Betriebssystem ausgeführt wird:

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

Beachten Sie , dass diese Methode die Registrierungseinstellung für alle Anwendungen ändert, die Version 4.0 der Microsoft Jet-Datenbank-Engine verwenden.

Methode 2: Verwenden von SetOption zum vorübergehenden Ändern von MaxLocksPerFile

Hinweis

Der Beispielcode in diesem Artikel verwendet Microsoft Data Access Objects. Damit dieser Code ordnungsgemäß ausgeführt werden kann, müssen Sie auf die Microsoft DAO 3.6-Objektbibliothek verweisen. Klicken Sie dazu im Visual Basic-Editor im Menü Extras auf Verweise, und stellen Sie sicher, dass das Kontrollkästchen Microsoft DAO 3.6-Objektbibliothek aktiviert ist.

Die Verwendung der hier aufgeführten Informationen, Makro- oder Programmcodes geschieht auf Ihre eigene Verantwortung. Microsoft stellt Ihnen diese Informationen sowie Makro- und Programmlistings ohne Gewähr auf Richtigkeit, Vollständigkeit und/oder Funktionsfähigkeit sowie ohne Anspruch auf Support zur Verfügung. Die zur Verfügung gestellten Makro- und Programmierungsbeispiele sollen lediglich exemplarisch die Funktionsweise des Beispiels aufzeigen. Die Microsoft Support-Spezialisten können bei der Erläuterung der Funktionalität bestimmter Prozeduren helfen, jedoch werden sie diese Beispiele nicht in Bezug auf eine erweiterte Funktionalität verändern, noch werden sie Prozeduren entwickeln, die auf Ihre besonderen Bedürfnisse zugeschnitten sind. Die SetOption-Methode überschreibt vorübergehend Werte für die Microsoft Jet-Datenbank-Engine-Schlüssel in der Registrierung. Der neue Wert bleibt gültig, bis Sie ihn erneut ändern oder bis das DBEngine-Objekt geschlossen wird.

Hinweis

Änderungen, die mit der SetOption-Methode an maxLocksPerFilesetting vorgenommen wurden, sind nur über die aktuelle Sitzung von Datenzugriffsobjekten (Data Access Objects, DAO) verfügbar. Abfragen, die über die Microsoft Access-Benutzeroberfläche ausgeführt werden, verwenden weiterhin die Einstellungen in der Registrierung.

Im folgenden Codebeispiel wird MaxLocksPerFile auf 200.000 festgelegt, bevor ein Aktualisierungsvorgang innerhalb einer Transaktion ausgeführt wird:

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

Methode 3: Festlegen der UseTransaction-Eigenschaft in einer Aktionsabfrage

Wenn eine gespeicherte Aktionsabfrage den Fehler verursacht, können Sie die UseTransaction-Eigenschaft auf Nein festlegen. Beachten Sie, dass Sie in diesem Fall keine Änderungen zurücksetzen können, wenn während der Ausführung der Abfrage ein Problem oder ein Fehler auftritt:

  1. Öffnen Sie die Abfrage in der Entwurfsansicht.
  2. Klicken Sie im Menü Ansicht auf Eigenschaften.
  3. Klicken Sie in der oberen Hälfte des Abfragefensters auf einen leeren Bereich, um das Dialogfeld Abfrageeigenschaften anzuzeigen.
  4. Legen Sie die Eigenschaft UseTransaction auf Nein fest.
  5. Speichern Sie die Abfrage, und schließen Sie sie.

Weitere Informationen

MaxLocksPerFilesetting in der Registrierung verhindert, dass Transaktionen in der Microsoft Jet-Datenbank-Engine einen angegebenen Wert überschreiten. Wenn eine Transaktion versucht, Sperren zu erstellen, die den MaxLocksPerFile-Wert übersteigen, wird die Transaktion in zwei oder mehr Teile aufgeteilt und teilweise committet.

Schritte zum Reproduzieren des Problems

Im folgenden Beispiel wird eine Visual Basic-Prozedur verwendet, um eine Tabelle mit 10.000 Datensätzen zu erstellen. Anschließend wird die Tabelle geändert, um die Fehlermeldung zu verursachen:

  1. Öffnen Sie die Beispieldatenbank Northwind.mdb.
  2. Erstellen Sie ein Modul, und geben Sie dann das folgende Verfahren ein:
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. Geben Sie zum Ausführen der Prozedur die folgende Zeile in das Direktfenster ein, und drücken Sie dann die EINGABETASTE:

    CreateBigTable
    

    Die Prozedur erstellt eine Tabelle namens BigTable mit 10.000 Datensätzen.

  2. Speichern Sie das Modul als Modul1, und schließen Sie es dann.

  3. Öffnen Sie die BigTable-Tabelle in der Entwurfsansicht.

  4. Ändern Sie die FieldSize-Eigenschaft von Field4 in 253.

  5. Speichern Sie die Tabelle. Klicken Sie auf Ja, wenn Sie aufgefordert werden, dass einige Daten verloren gehen können.

    Beachten Sie, dass Sie nach einer Weile die folgenden Fehlermeldungen erhalten:

    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.