Felmeddelandet "Det finns inte tillräckligt med diskutrymme eller minne" visas när du utför en åtgärd på en Access-tabell

Anteckning

Office 365 ProPlus byter namn till Microsoft 365-appar för företag. Mer information om den här ändringen finns i det här blogginlägget.

Avancerat: Kräver expertkodning, interoperabilitet och fleranvändarfärdigheter.

Den här artikeln gäller endast för Microsoft Access-databaser (.mdb).

Symptom

När du utför en åtgärd i en tabell kan du få följande felmeddelande om åtgärden skapar ett stort antal sidlås: Det finns inte tillräckligt med diskutrymme eller minne.

Om du kör en åtgärdsfråga på en stor tabell kan du få följande felmeddelande: Det finns inte tillräckligt med diskutrymme eller minne för att ångra de dataändringar som den här åtgärdsfrågan ska göra.

Orsak

Sidan lås som krävs för transaktionen överskrider värdet maxLocksPerFile, som standard 9500 lås. MaxLocksPerFilesetting lagras i Windows-registret.

Lösning

Viktigt

Det här avsnittet, metoden eller uppgiften innehåller steg som beskriver hur du ändrar registret. Det kan uppstå allvarliga problem om du gör detta felaktigt. Följ därför instruktionerna noga, och säkerhetskopiera registret innan du gör några ändringar i det. Då kan du återställa registret om det uppstår problem. Om du vill ha mer information om hur du både kan backa och återställa registret kan du klicka på följande artikelnummer och läsa artikeln i Microsoft Knowledge Base:

322756 Backa och återställa registret i Windows

Det finns flera sätt att komma runt det här problemet:

  • Du kan Regedit.exe redigera registret och ändra MaxLocksPerFilevalue permanent.
  • Du kan använda SetOptionmethod för DBEngine-objektet till att ändra MaxLocksPerFilevalue tillfälligt i koden.
  • Om felet uppstår när du kör en åtgärdsfråga kan du ändra frågan och ange dess UseTransactionproperty till No.

Metod 1: Ändra MaxLocksPerFile i registret

Använd Registereditorn för att öka värdet för MaxLocksPerFile med följande nyckel:

För Microsoft Access 2000, Microsoft Access 2002 och Microsoft Office Access 2003 som körs på ett 32-bitars Windows-operativsystem:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet 4,0

För Microsoft Access 2000, Microsoft Access 2002 och Microsoft Office Access 2003 som körs på ett 64-bitars Windows-operativsystem:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Jet 4,0

För Microsoft Office Access 2007 som körs på ett 32-bitars Windows-operativsystem:

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

För Microsoft Office Access 2007 som körs på ett 64-bitars Windows-operativsystem:

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

För Microsoft Access 2010 som körs på ett 32-bitars Windows-operativsystem:

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

För Microsoft Office Access 2010 som körs på ett 64-bitars Windows-operativsystem:

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

För Microsoft Access 2013 som körs på ett 32-bitars Windows-operativsystem:

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

För Microsoft Office Access 2013 som körs på ett 64-bitars Windows-operativsystem:

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

För Microsoft Access 2016 som körs på ett 32-bitars Windows-operativsystem:

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

För Microsoft Office Access 2016 som körs på ett 64-bitars Windows-operativsystem:

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

Observera att den här metoden ändrar registerinställningen för alla program som använder Microsoft Jet-databasmotorn version 4.0.

Metod 2: Använda SetOption för att ändra MaxLocksPerFile tillfälligt

Anteckning

I exempelkoden i den här artikeln används Microsoft Data Access-objekt. För att den här koden ska köras korrekt måste du referera till Microsoft DAO 3.6-objektbiblioteket. Det gör du genom att klicka på Referenser på menyn Verktyg i Visual Basic Editor och kontrollera att kryssrutan Microsoft DAO 3.6-objektbibliotek är markerad.

Microsoft tillhandahåller programmeringsexempel enbart i förklarande syfte och gör inga utfästelser, varken uttryckligen eller underförstått. Detta omfattar men begränsas inte till underförstådd garanti för säljbarhet eller lämplighet för ett visst syfte. I denna artikel förutsätts att du känner till det programmeringsspråk som demonstreras och de verktyg som används för att skapa och felsöka procedurer. Microsofts supportexperter kan hjälpa till att förklara funktionerna i en viss procedur, men de kommer inte att ändra dessa exempel för att tillhandahålla extra funktioner eller konstruera procedurer för att uppfylla dina specifika behov. SetOptionmethod åsidosätter tillfälligt värden för Microsoft Jet-databasmotorns nycklar i registret. Det nya värdet förblir i kraft tills du ändrar det igen eller tills DBEngine-objektet stängs.

Anteckning

Ändringar som görs i MaxLocksPerFilesetting med hjälp av metoden SetOption är bara tillgängliga under den aktuella sessionen av Data Access Objects (DAO). Frågor som körs via Microsoft Access-användargränssnittet kommer fortfarande att använda inställningarna i registret.

Följande kodexempel anger MaxLocksPerFile till 200 000 innan du kör en uppdateringsåtgärd i en transaktion:

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

Metod 3: Ange egenskapen UseTransaction i en åtgärdsfråga

Om en lagrad åtgärdsfråga orsakar felet kan du ange dess UseTransaction-egenskap till Nej. Observera att om du gör det kan du inte återställa ändringarna om det uppstår ett problem eller ett fel medan frågan körs:

  1. Öppna frågan i designvyn.
  2. Klicka på Egenskaper på Visa-menyn.
  3. Klicka på ett tomt utrymme i den övre halvan av frågefönstret för att visa dialogrutan Frågeegenskaper.
  4. Ställ in UseTransactionproperty på No.
  5. Spara frågan och stäng den.

Mer information

MaxLocksPerFilesetting i registret förhindrar att transaktioner i Microsoft Jet-databasmotorn överskrider ett visst värde. Om en transaktion försöker skapa lås utöver maxLocksPerFile-värdet delas transaktionen upp i två eller flera delar och delvis har genomförts.

Steg för att återskapa problemet

I följande exempel används en Visual Basic-procedur för att skapa en tabell med 10 000 poster och sedan ändrar tabellen för att orsaka felmeddelandet:

  1. Öppna exempeldatabasen Northwind.mdb.
  2. Skapa en modul och skriv sedan följande procedur:
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. Om du vill köra proceduren skriver du följande rad i direktfönstret och trycker sedan på RETUR:

    CreateBigTable
    

    Proceduren skapar en tabell med namnet BigTable med 10 000 poster i den.

  2. Spara modulen som Modul1 och stäng den sedan.

  3. Öppna tabellen BigTable i designvyn.

  4. Ändra fältstorlekseproperty för Fält4 till 253.

  5. Spara tabellen. Klicka på Ja när du uppmanas att vissa data kan gå förlorade.

    Observera att du efter en stund får följande felmeddelanden:

    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.