Chyba "Na disku není dostatek místa nebo paměti" při provádění operace s tabulkou Accessu

Pokročilé: Vyžaduje odborné kódování, interoperabilitu a víceuživatelské dovednosti.

Tento článek se týká pouze databáze aplikace Microsoft Access (.mdb).

Příznaky

Při provádění operace s tabulkou se může zobrazit následující chybová zpráva, pokud operace vytvoří velký počet zámků stránky: Na disku není dostatek místa nebo paměti.

Pokud spustíte akční dotaz pro velkou tabulku, může se zobrazit následující chybová zpráva: Na disku není dostatek místa nebo paměti pro vrácení změn dat, které tento akční dotaz chystá provést.

Příčina

Zámky stránky požadované pro transakci překračují hodnotu MaxLocksPerFile, která ve výchozím nastavení je 9500 zámků. Nastavení MaxLocksPerFilesetting je uloženo v registru systému Windows.

Řešení

Důležité

Tato sekce, metoda, nebo úkol obsahují kroky popisující, jak upravit registr. Úprava registru nesprávným způsobem může způsobit vážné problémy. Proto vždy pečlivě zkontrolujte, jestli postupujete přesně podle těchto kroků. Jako dodatečnou ochranu registr před úpravami zálohujte. Potom můžete v případě problému registr obnovit. Další informace o zálohování a obnovení registru naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:

322756 Postup zálohování a obnovení registru v systému Windows

Existuje několik způsobů, jak tento problém vyřešit:

  • Regedit.exe můžete použít k úpravě registru a trvalé změně hodnoty MaxLocksPerFile.
  • Můžete použít SetOptionmethod DBEngine objektu změnit MaxLocksPerFilevalue dočasně v kódu.
  • Pokud k chybě dojde při spuštění akčního dotazu, můžete dotaz upravit a nastavit jeho UseTransactionproperty na Ne.

Metoda 1: Změna souboru MaxLocksPerFile v registru

Pomocí Editor registru zvyšte hodnotu MaxLocksPerFile pod následujícím klíčem:

V aplikaci Microsoft Access 2000 v aplikaci Microsoft Access 2002 a Microsoft Office Access 2003, které běží v 32bitovém operačním systému Windows:

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

Microsoft Access 2000 v aplikaci Microsoft Access 2002 a Microsoft Office Access 2003, které běží v 64bitovém operačním systému Windows:

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

Microsoft Office Access 2007, který běží na 32bitovém operačním systému Windows:

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

Microsoft Office Access 2007 spuštěný v 64bitovém operačním systému Windows:

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

Pro Microsoft® Access® 2010, který běží na 32bitovém operačním systému Windows:

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

Microsoft Office Access 2010 spuštěný v 64bitovém operačním systému Windows:

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

Pro Microsoft Access 2013, který běží v 32bitovém operačním systému Windows:

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

Microsoft Office Access 2013 spuštěný v 64bitovém operačním systému Windows:

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

Microsoft Access 2016, který běží na 32bitovém operačním systému Windows:

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

Microsoft Office Access 2016, který běží v 64bitovém operačním systému Windows:

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

Všimněte si , že tato metoda mění nastavení registru pro všechny aplikace, které používají databázový stroj Microsoft Jet verze 4.0.

Metoda 2: Použití SetOption k dočasné změně MaxLocksPerFile

Poznámka

Ukázkový kód v tomto článku používá objekty Microsoft Data Access. Aby tento kód běžel správně, musíte odkazovat na knihovnu objektů Microsoft DAO 3.6. Uděláte to tak, že kliknete na Odkazy v nabídce Nástroje v Editor Jazyka Visual Basic a zkontrolujete, že je zaškrtnuté políčko Knihovna objektů Microsoft DAO 3.6.

Společnost Microsoft poskytuje ukázky programování pouze pro ilustraci, bez žádné záruky výslovně uvedené nebo odvozené, včetně, bez omezení, odvozených záruk vztahujících se k obchodovatelnosti nebo vhodnosti pro určitý účel. Tento článek předpokládá, že uživatel je obeznámen s programovacím jazykem, který je předmětem ukázky, a s nástroji použitými pro vytvoření a ladění skriptu. Pracovníci technické podpory společnosti Microsoft mohou vysvětlit funkce určitého postupu, nemohou však následující příklady rozšířit o další funkce nebo konstrukce podle konkrétních požadavků uživatele. SetOptionmethod dočasně přepíše hodnoty pro klíče databázového stroje Microsoft Jet v registru. Nová hodnota zůstane v platnosti, dokud ji znovu nezměníte, nebo dokud se objekt DBEngine nezavře.

Poznámka

Změny nastavení MaxLocksPerFilesetting pomocí metody SetOption budou dostupné pouze prostřednictvím aktuální relace objektu DAO (Data Access Objects). Dotazy, které se spouští prostřednictvím uživatelského rozhraní aplikace Microsoft Access, budou i nadále používat nastavení v registru.

Následující ukázka kódu nastaví MaxLocksPerFile na 200 000 před spuštěním operace aktualizace uvnitř transakce:

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

Metoda 3: Nastavení vlastnosti UseTransaction v akčním dotazu

Pokud chybu způsobí uložený akční dotaz, můžete jeho vlastnost UseTransaction nastavit na Hodnotu Ne. Všimněte si, že pokud to uděláte, nemůžete vrátit změny zpět, pokud dojde k problému nebo chybě při spuštění dotazu:

  1. Otevřete dotaz v návrhovém zobrazení.
  2. V nabídce Zobrazení klikněte na Vlastnosti.
  3. Kliknutím na prázdné místo v horní polovině okna dotazu zobrazíte dialogové okno Vlastnosti dotazu.
  4. Nastavte vlastnost UseTransaction na Ne.
  5. Uložte dotaz a zavřete ho.

Další informace

Nastavení MaxLocksPerFilesetting v registru zabraňuje transakcím v databázovém stroji Microsoft Jet překročit zadanou hodnotu. Pokud se transakce pokusí vytvořit zámky nad hodnotu MaxLocksPerFile, transakce je rozdělena do dvou nebo více částí a částečně potvrzena.

Kroky pro reprodukci problému

Následující příklad používá proceduru jazyka Visual Basic k vytvoření tabulky s 10 000 záznamy a potom upraví tabulku tak, aby způsobila chybovou zprávu:

  1. Otevřete Northwind.mdb ukázkové databáze.
  2. Vytvořte modul a zadejte následující postup:
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. Postup spustíte tak, že v okně Immediate (Okamžité) zadáte následující řádek a stisknete klávesu ENTER:

    CreateBigTable
    

    Procedura vytvoří tabulku s názvem BigTable s 10 000 záznamy.

  2. Uložte modul jako Modul1 a pak ho zavřete.

  3. Otevřete tabulku BigTable v návrhovém zobrazení.

  4. Změňte vlastnost FieldSize (Velikost pole) pole 4 na 253.

  5. Uložte tabulku. Po zobrazení výzvy ke ztrátě některých dat klikněte na Ano.

    Všimněte si, že po chvíli se zobrazí následující chybové zprávy:

    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.