Freigeben über


Fehler "Nicht genügend Speicherplatz oder Arbeitsspeicher", wenn Sie einen Vorgang in einer Access-Tabelle ausführen

Erweitert: Erfordert Expertencodierung, Interoperabilität und Mehrbenutzerkenntnisse.

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

Symptome

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

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

Ursache

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

Beschluss

Von Bedeutung

Dieser Abschnitt, die Methode oder die Aufgabe enthält Schritte, mit denen Sie erfahren, wie Sie die Registrierung ändern. Es können jedoch schwerwiegende Probleme auftreten, wenn Sie die Registrierung falsch ändern. Stellen Sie daher sicher, dass Sie diese Schritte sorgfältig ausführen. Zur zusätzlichen Sicherheit sichern Sie die Registrierung, bevor Sie sie ändern. Anschließend können Sie die Registrierung wiederherstellen, wenn ein Problem auftritt. Weitere Informationen zum Sichern und Wiederherstellen der Registrierung finden Sie unter 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 MaxLocksPerFilevalue 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 auftritt, wenn Sie eine Aktionsabfrage ausführen, können Sie die Abfrage ändern und dessen UseTransactionproperty auf "Nein" festlegen.

Methode 1: Ändern von MaxLocksPerFile in der Registrierung

Verwenden Sie den Registrierungs-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 auf 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 auf 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 auf 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 auf 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, das auf 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 auf 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, das auf 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 auf 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, das auf 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, das auf 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 microsoft Jet-Datenbankmodul Version 4.0 verwenden.

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

Hinweis

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

Microsoft bietet Programmierbeispiele ausschließlich zu Illustrationszwecken an, ohne Gewährleistung, weder ausdrücklich noch impliziert. Dies enthält, ohne Beschränkung, die stillschweigenden Garantien von Marktfähigkeit oder Eignung für einen bestimmten Zweck. Dieser Artikel setzt voraus, dass Sie sich mit der Programmiersprache auskennen, die hier gezeigt wird, und mit den Tools, die zum Erzeugen von Verfahren und zur Fehlerbeseitigung daran benutzt werden. Microsoft-Supporttechniker können dabei helfen, die Funktionalität eines bestimmten Verfahrens zu erläutern, aber sie ändern diese Beispiele nicht, um zusätzliche Funktionen bereitzustellen oder Verfahren zu erstellen, um Ihre spezifischen Anforderungen zu erfüllen. Die SetOption Methode überschreibt vorübergehend Werte für die Schlüssel der Microsoft Jet-Datenbankengine in der Registrierung. Der neue Wert bleibt wirksam, bis Sie ihn erneut ändern oder bis das DBEngine-Objekt geschlossen wird.

Hinweis

Änderungen am MaxLocksPerFilesetting mithilfe der SetOption Methode sind nur über die aktuelle Sitzung von 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 dessen UseTransaction Eigenschaft auf "Nein" festlegen.

Hinweis: Wenn Sie dies tun, können Sie ihre Änderungen nicht zurücksetzen, wenn ein Problem oder ein Fehler auftritt, während die Abfrage ausgeführt wird.

  1. Öffnen Sie die Abfrage in der Entwurfsansicht.
  2. Wählen Sie im Menü "Ansicht" die Option "Eigenschaften" aus.
  3. Wählen Sie in der oberen Hälfte des Abfragefensters ein leeres Leerzeichen aus, um das Dialogfeld 'Abfrageeigenschaften' anzuzeigen.
  4. Legen Sie die UseTransactionproperty auf "Nein" fest.
  5. Speichern Sie die Abfrage, und schließen Sie sie.

Mehr Informationen

Die MaxLocksPerFilesetting Registrierung verhindert, dass Transaktionen im Microsoft Jet-Datenbankmodul einen angegebenen Wert überschreiten. Wenn eine Transaktion versucht, Sperren über den MaxLocksPerFile-Wert zu erstellen, wird die Transaktion in zwei oder mehr Teile aufgeteilt und teilweise zugesichert.

Schritte zum Reproduzieren des Problems

Im folgenden Beispiel wird eine Visual Basic-Prozedur verwendet, um eine Tabelle mit 10.000 Datensätzen darin zu erstellen, und ändert dann die Tabelle, um die Fehlermeldung zu verursachen:

  1. Öffnen Sie die Beispieldatenbank Northwind.mdb.
  2. Erstellen Sie ein Modul, und geben Sie dann die folgende Prozedur 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 im 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.

  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 darauf hingewiesen werden, dass einige Daten verloren gehen könnten.

    Beachten Sie, dass nach einer Weile die folgenden Fehlermeldungen angezeigt werden:

    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.