Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
- Öffnen Sie die Abfrage in der Entwurfsansicht.
- Wählen Sie im Menü "Ansicht" die Option "Eigenschaften" aus.
- Wählen Sie in der oberen Hälfte des Abfragefensters ein leeres Leerzeichen aus, um das Dialogfeld 'Abfrageeigenschaften' anzuzeigen.
- Legen Sie die UseTransactionproperty auf "Nein" fest.
- 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:
- Öffnen Sie die Beispieldatenbank Northwind.mdb.
- 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
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.
Speichern Sie das Modul als Modul1, und schließen Sie es.
Ö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 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.