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 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 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, das 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, das 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, das 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, das 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. 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. 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:
- Öffnen Sie die Abfrage in der Entwurfsansicht.
- Klicken Sie im Menü Ansicht auf Eigenschaften.
- Klicken Sie in der oberen Hälfte des Abfragefensters auf einen leeren Bereich, um das Dialogfeld Abfrageeigenschaften anzuzeigen.
- Legen Sie die Eigenschaft UseTransaction auf Nein fest.
- 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:
- Öffnen Sie die Beispieldatenbank Northwind.mdb.
- 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
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.
Speichern Sie das Modul als Modul1, und schließen Sie es dann.
Öffnen Sie die BigTable-Tabelle in der Entwurfsansicht.
Ändern Sie die FieldSize-Eigenschaft von Field4 in 253.
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.