Fehler "Nicht genügend Speicherplatz oder Arbeitsspeicher" beim Ausführen eines Vorgangs für eine Access-Tabelle
Erweitert: Erfordert Expertencodierung, Interoperabilität und Multiuser-Fähigkeiten.
Dieser Artikel gilt nur für eine Microsoft Access-Datenbank (MDB).
Problembeschreibung
Wenn Sie einen Vorgang für eine Tabelle ausführen, wird möglicherweise die folgende Fehlermeldung angezeigt, wenn durch den Vorgang eine große Anzahl von Seitensperren erstellt wird: Es ist nicht genügend Speicherplatz vorhanden.
Wenn Sie eine Aktionsabfrage für eine große 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 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 MaxLocksPerFilevalue dauerhaft zu ändern.
- Sie können die SetOptionmethod des DBEngine-Objekts verwenden, um den MaxLocksPerFilevalue vorübergehend im Code zu ändern.
- Wenn der Fehler auftritt, wenn Sie eine Aktionsabfrage ausführen, können Sie die Abfrage ändern und ihre 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 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 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. 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. SetOptionmethod überschreibt vorübergehend Werte für die Microsoft Jet-Datenbankmodulschlüssel in der Registrierung. Der neue Wert bleibt in Kraft, bis Sie ihn erneut ändern oder bis das DBEngine-Objekt geschlossen ist.
Hinweis
Änderungen, die mithilfe der SetOption-Methode am MaxLocksPerFilesetting vorgenommen wurden, 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 der Fehler durch eine gespeicherte Aktionsabfrage verursacht wird, können Sie die UseTransaction-Eigenschaft auf "Nein" festlegen. Beachten Sie, dass Sie in diesem Beispiel die Änderungen nicht 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 auf einen leeren Bereich in der oberen Hälfte des Abfragefensters, um das Dialogfeld "Abfrageeigenschaften" anzuzeigen.
- Legen Sie "UseTransactionproperty" auf "Nein" fest.
- Speichern Sie die Abfrage, und schließen Sie sie.
Weitere Informationen
MaxLocksPerFilesetting in der Registrierung verhindert, dass Transaktionen im Microsoft Jet-Datenbankmodul einen angegebenen Wert überschreiten. Wenn eine Transaktion versucht, Sperren zu erstellen, die den MaxLocksPerFile-Wert überschreiten, 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 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
Um die Prozedur auszuführen, geben Sie im Direktfenster die folgende Zeile 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.
Öffnen Sie die BigTable-Tabelle in der Entwurfsansicht.
Ändern Sie die Feldgrößeeigenschaft von Feld4 in 253.
Speichern Sie die Tabelle. Klicken Sie auf "Ja", wenn Sie aufgefordert werden, dass einige Daten möglicherweise verloren gehen.
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.
Feedback
Feedback senden und anzeigen für