Błąd "Brakuje miejsca na dysku lub pamięci" podczas wykonywania operacji na tabeli programu Access

Uwaga

Nazwa usługi Office 365 ProPlus została zmieniona na Aplikacje usługi Microsoft 365 dla przedsiębiorstw. Aby uzyskać więcej informacji na temat tej zmiany, przeczytaj ten wpis w blogu.

Zaawansowane. Wymaga kodowania eksperta, współdziałania i umiejętności wielu użytkowników.

Ten artykuł dotyczy tylko bazy danych programu Microsoft Access (mdb).

Symptomy

Podczas wykonywania operacji na tabeli, jeśli operacja tworzy dużą liczbę blokad stron, może zostać wyświetlony następujący komunikat o błędzie: Za mało miejsca na dysku lub pamięci.

Jeśli uruchamiasz zapytanie akcji w dużej tabeli, może zostać wyświetlony następujący komunikat o błędzie: Za mało miejsca na dysku lub pamięci, aby cofnąć zmiany danych, które ma wprowadzić to zapytanie.

Przyczyna

Blokady stron wymagane dla transakcji przekraczają wartość MaxLocksPerFile, co domyślnie wynosi 9500 blokad. Ustawienia MaxLocksPerFilesetting są przechowywane w rejestrze systemu Windows.

Rozwiązanie

Ważne

W tej sekcji, metodzie lub w tym zadaniu podano informacje dotyczące modyfikowania rejestru. Niepoprawne zmodyfikowanie rejestru może jednak być przyczyną poważnych problemów. Dlatego należy uważnie wykonywać podane czynności. Dla większego bezpieczeństwa przed zmodyfikowaniem rejestru należy wykonać jego kopię zapasową. Dzięki temu będzie można przywrócić rejestr w przypadku wystąpienia problemu. Aby uzyskać więcej informacji na temat kopii zapasowej i przywracania rejestru, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:

322756 Jak zrobić kopię zapasową rejestru i przywrócić go w systemie Windows

Istnieje kilka sposobów, aby rozwiązać ten problem:

  • Możesz użyć Regedit.exe rejestru i trwale zmienić wartość MaxLocksPerFile.
  • Aby tymczasowo zmienić wartość MaxLocksPerFile w kodzie, można użyć ustawienia SetOptionmethod obiektu DBEngine.
  • Jeśli podczas uruchamiania zapytania akcji wystąpi błąd, można zmodyfikować zapytanie i ustawić dla jego właściwości UseTransaction wartość Nie.

Metoda 1. Zmiana ustawienia MaxLocksPerFile w rejestrze

Użyj Edytora rejestru, aby zwiększyć wartość MaxLocksPerFile poniżej następującego klucza:

W przypadku programu Microsoft Access 2000, Microsoft Access 2002 i Microsoft Office Access 2003 działających w 32-bitowym systemie operacyjnym Windows:

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

W przypadku programu Microsoft Access 2000, Microsoft Access 2002 i Microsoft Office Access 2003 działających w 64-bitowym systemie operacyjnym Windows:

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

W przypadku programu Microsoft Office Access 2007 działającego w 32-bitowym systemie operacyjnym Windows:

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

W przypadku programu Microsoft Office Access 2007 działającego w 64-bitowym systemie operacyjnym Windows:

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

W przypadku programu Microsoft Access 2010 działającego w 32-bitowym systemie operacyjnym Windows:

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

W przypadku programu Microsoft Office Access 2010 działającego w 64-bitowym systemie operacyjnym Windows:

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

W przypadku programu Microsoft Access 2013 działającego w 32-bitowym systemie operacyjnym Windows:

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

W przypadku programu Microsoft Office Access 2013 działającego w 64-bitowym systemie operacyjnym Windows:

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

W przypadku programu Microsoft Access 2016 działającego w 32-bitowym systemie operacyjnym Windows:

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

W przypadku programu Microsoft Office Access 2016 działającego w 64-bitowym systemie operacyjnym Windows:

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

Zwróć uwagę, że ta metoda zmienia ustawienie rejestru dla wszystkich aplikacji, które korzystają z aparatu bazy danych Microsoft Jet w wersji 4.0.

Metoda 2. Tymczasowe zmienianie ustawienia MaxLocksPerFile za pomocą ustawienia SetOption

Uwaga

W przykładowym kodzie w tym artykule użyto obiektów Microsoft Data Access Objects. Aby ten kod działał poprawnie, musisz odwołać się do biblioteki obiektów platformy Microsoft DAO 3.6. W tym celu kliknij polecenie Odwołania w menu Narzędzia w Edytorze Visual Basic i upewnij się, że jest zaznaczone pole wyboru Biblioteka obiektów platformy Microsoft DAO 3.6.

Firma Microsoft podaje przykłady programowania tylko dla celów ilustracyjnych, nie udzielając żadnej rękojmi, wyrażonej wprost ani dorozumianej, w tym także, ale nie tylko, dorozumianej rękojmi co do przydatności handlowej lub do określonych celów. W tym artykule zakłada się, że czytelnik zna demonstrowany język programowania oraz narzędzia używane do tworzenia i debugowania procedur. Wykwalifikowani pracownicy pomocy technicznej firmy Microsoft mogą pomóc w wyjaśnieniu, jak działa określona procedura, ale nie będą modyfikować tych przykładów ani dodawać żadnych funkcji i konstruować nowych procedur w celu dostosowania ich do określonych potrzeb użytkownika. System SetOptionmethod tymczasowo zastępuje wartości kluczy aparatu bazy danych Microsoft Jet w rejestrze. Nowa wartość będzie obowiązywać do czasu jej zmiany lub zamknięcia obiektu DBEngine.

Uwaga

Zmiany wprowadzone w ustawieniach MaxLocksPerFilesetting przy użyciu metody SetOption będą dostępne tylko w bieżącej sesji obiektów programu Data Access Objects (DAO). Zapytania uruchamiane za pomocą interfejsu użytkownika programu Microsoft Access nadal będą używać ustawień w rejestrze.

Poniższy przykładowy kod ustawia wartość MaxLocksPerFile na 200 000 przed wykonaniem operacji aktualizacji wewnątrz transakcji:

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. Ustawianie właściwości UseTransaction (Użyj tłumaczenia) w zapytaniu akcji

Jeśli zapytanie przechowywanej akcji powoduje błąd, można ustawić dla właściwości UseTransaction wartość Nie. Zwróć uwagę, że w przypadku wystąpienia problemu lub błędu podczas działania zapytania nie można wycofać zmian:

  1. Otwórz zapytanie w widoku projektu.
  2. W menu Widok kliknij polecenie Właściwości.
  3. Kliknij puste miejsce w górnej połowie okna zapytania, aby wyświetlić okno dialogowe Właściwości zapytania.
  4. Ustaw dla właściwości UseTransactionproperty wartość Nie.
  5. Zapisz zapytanie i zamknij je.

Więcej informacji

Ustawienia MaxLocksPerFilesetting w rejestrze zapobiegają przekroczeniu określonej wartości przez aparat bazy danych Microsoft Jet. Jeśli transakcja spróbuje utworzyć blokady w nadmiarze wartości MaxLocksPerFile, transakcja zostanie podzielona na dwie lub więcej części i częściowo zatwierdzona.

Procedura odtworzenia problemu

W poniższym przykładzie użyto procedury języka Visual Basic w celu utworzenia tabeli z 10 000 rekordów, a następnie zmodyfikuje tabelę w celu wystąpienia komunikatu o błędzie:

  1. Otwórz przykładową bazę danych Northwind.mdb.
  2. Utwórz moduł, a następnie wpisz następującą 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. Aby uruchomić procedurę, wpisz następujący wiersz w oknie bezpośrednim i naciśnij klawisz ENTER:

    CreateBigTable
    

    Procedura tworzy tabelę o nazwie BigTable z 10 000 rekordów.

  2. Zapisz moduł jako Moduł1, a następnie zamknij go.

  3. Otwórz tabelę BigTable w widoku projektu.

  4. Zmień właściwości RozmiarPola z Field4 na 253.

  5. Zapisz tabelę. Po wyświetleniu monitu o zgubione dane kliknij przycisk Tak.

    Pamiętaj, że po chwili są wyświetlane następujące komunikaty o błędach:

    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.