Fout 'Er is onvoldoende schijfruimte of geheugen' wanneer u een bewerking uitvoert in een Access-tabel

Geavanceerd: vereist professionele codering, interoperabiliteit en vaardigheden voor meerdere gebruikers.

Dit artikel is alleen van toepassing op een Microsoft Access-database (.mdb).

Symptomen

Wanneer u een bewerking uitvoert in een tabel, wordt mogelijk het volgende foutbericht weergegeven als de bewerking een groot aantal paginavergrendelingen maakt: Er is onvoldoende schijfruimte of geheugen.

Als u een actiequery uitvoert op een grote tabel, wordt mogelijk het volgende foutbericht weergegeven: Er is onvoldoende schijfruimte of geheugen om de gegevenswijzigingen ongedaan te maken die deze actiequery gaat aanbrengen.

Oorzaak

De paginavergrendelingen die zijn vereist voor de transactie overschrijden de waarde MaxLocksPerFile, die standaard 9500 vergrendelingen heeft. De MaxLocksPerFilesetting wordt opgeslagen in het Windows-register.

Oplossing

Belangrijk

Deze sectie, methode of taak bevat stappen voor het bewerken van het register. Als u het register op onjuiste wijze wijzigt, kunnen er echter grote problemen optreden. Het is dan ook belangrijk dat u deze stappen zorgvuldig uitvoert. Maak een back-up van het register voordat u wijzigingen aanbrengt. Als er een probleem optreedt, kunt u het register altijd nog herstellen. Als u meer informatie wilt over het maken van een back-up van het register en het herstellen van het register, klikt u op de volgende artikelnummers in de Microsoft Knowledge Base:

322756 Een back-up nemen en het herstellen van het register in Windows

Er zijn verschillende manieren om dit probleem te omzeilen:

  • U kunt Regedit.exe gebruiken om het register te bewerken en de waarde MaxLocksPerFile permanent te wijzigen.
  • U kunt de SetOptionmethod van het DBEngine-object gebruiken om de waarde MaxLocksPerFile tijdelijk in code te wijzigen.
  • Als de fout optreedt wanneer u een actiequery uitvoert, kunt u de query wijzigen en de Bijbehorende UseTransactionproperty instellen op Nee.

Methode 1: MaxLocksPerFile wijzigen in het register

Gebruik Register Editor om de waarde MaxLocksPerFile onder de volgende sleutel te verhogen:

Voor Microsoft Access 2000, in Microsoft Access 2002 en in Microsoft Office Access 2003 die worden uitgevoerd op een 32-bits Windows-besturingssysteem:

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

Voor Microsoft Access 2000, in Microsoft Access 2002 en in Microsoft Office Access 2003 die worden uitgevoerd op een 64-bits Windows-besturingssysteem:

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

Voor Microsoft Office Access 2007 die wordt uitgevoerd op een 32-bits Windows-besturingssysteem:

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

Voor Microsoft Office Access 2007 die wordt uitgevoerd op een 64-bits Windows-besturingssysteem:

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

Voor Microsoft® Access® 2010 die wordt uitgevoerd op een 32-bits Windows-besturingssysteem:

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

Voor Microsoft Office Access 2010 die wordt uitgevoerd op een 64-bits Windows-besturingssysteem:

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

Voor Microsoft Access 2013 die wordt uitgevoerd op een 32-bits Windows-besturingssysteem:

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

Voor Microsoft Office Access 2013 die wordt uitgevoerd op een 64-bits Windows-besturingssysteem:

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

Voor Microsoft Access 2016 die wordt uitgevoerd op een 32-bits Windows-besturingssysteem:

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

Voor Microsoft Office Access 2016 die wordt uitgevoerd op een 64-bits Windows-besturingssysteem:

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

Houd er rekening mee dat met deze methode de registerinstelling wordt gewijzigd voor alle toepassingen die microsoft Jet-database-engine versie 4.0 gebruiken.

Methode 2: SetOption gebruiken om MaxLocksPerFile tijdelijk te wijzigen

Opmerking

De voorbeeldcode in dit artikel maakt gebruik van Microsoft Data Access-objecten. Deze code wordt alleen correct uitgevoerd als u naar de Microsoft DAO 3.6-objectbibliotheek verwijst. Klik hiervoor op Verwijzingen in het menu Extra in de Visual Basic Editor en zorg ervoor dat het selectievakje Microsoft DAO 3.6-objectbibliotheek is ingeschakeld.

Microsoft verstrekt programmeervoorbeelden alleen ter illustratie, zonder expliciete of impliciete garantie. daaronder mede begrepen, maar niet beperkt tot impliciete garanties met betrekking tot de verkoopbaarheid en/of geschiktheid voor een bepaald doel. In dit artikel wordt ervan uitgegaan dat u bekend bent met de programmeertaal VBScript, alsmede met de hulpprogramma's waarmee procedures worden gemaakt en waarmee fouten in procedures worden opgespoord. U kunt desgewenst contact opnemen met Microsoft Product Support Services voor uitleg over de functie van een bepaalde procedure. Microsoft Product Support Services is echter niet bereid de voorbeelden aan te passen om extra functies toe te voegen of om procedures te maken die aan uw specifieke eisen voldoen. De SetOptionmethod overschrijft tijdelijk waarden voor de Microsoft Jet-database-enginesleutels in het register. De nieuwe waarde blijft van kracht totdat u deze opnieuw wijzigt of totdat het DBEngine-object is gesloten.

Opmerking

Wijzigingen die zijn aangebracht in de MaxLocksPerFilesetting met behulp van de methode SetOption, zijn alleen beschikbaar via de huidige sessie van Data Access Objects (DAO). Query's die worden uitgevoerd via de Gebruikersinterface van Microsoft Access, gebruiken nog steeds de instellingen in het register.

Met het volgende codevoorbeeld wordt MaxLocksPerFile ingesteld op 200.000 voordat een updatebewerking binnen een transactie wordt uitgevoerd:

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: de eigenschap UseTransaction instellen in een actiequery

Als een opgeslagen actiequery de fout veroorzaakt, kunt u de eigenschap UseTransaction instellen op Nee. Houd er rekening mee dat als u dit doet, u uw wijzigingen niet kunt terugdraaien als er een probleem of een fout is terwijl de query wordt uitgevoerd:

  1. Open de query in de ontwerpweergave.
  2. Klik in het menu Beeld op Eigenschappen.
  3. Klik op een lege ruimte in de bovenste helft van het queryvenster om het dialoogvenster Queryeigenschappen weer te geven.
  4. Stel de UseTransactionproperty in op Nee.
  5. Sla de query op en sluit deze.

Meer informatie

De MaxLocksPerFilesetting in het register voorkomt dat transacties in de Microsoft Jet-database-engine een opgegeven waarde overschrijden. Als een transactie probeert vergrendelingen te maken die groter zijn dan de maxLocksPerFile-waarde, wordt de transactie opgesplitst in twee of meer onderdelen en gedeeltelijk doorgevoerd.

Stappen om dit probleem te reproduceren

In het volgende voorbeeld wordt een Visual Basic-procedure gebruikt om een tabel met 10.000 records te maken en wijzigt vervolgens de tabel om het foutbericht te veroorzaken:

  1. Open de voorbeelddatabase Northwind.mdb.
  2. Maak een module en typ de volgende procedure:
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. Als u de procedure wilt uitvoeren, typt u de volgende regel in het venster Direct en drukt u op Enter:

    CreateBigTable
    

    De procedure maakt een tabel met de naam BigTable met 10.000 records erin.

  2. Sla de module op als Module1 en sluit deze.

  3. Open de tabel BigTable in de ontwerpweergave.

  4. Wijzig de FieldSizeproperty van Field4 in 253.

  5. Sla de tabel op. Klik op Ja wanneer u wordt gevraagd of sommige gegevens verloren kunnen gaan.

    Houd er rekening mee dat u na een tijdje de volgende foutberichten ontvangt:

    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.