Błąd "Za mało miejsca na dysku lub pamięci" podczas wykonywania operacji w tabeli programu Access

Zaawansowane: wymaga specjalistycznego kodowania, współdziałania i wielodostępnych umiejętności.

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

Symptomy

Podczas wykonywania operacji na tabeli może zostać wyświetlony następujący komunikat o błędzie, jeśli operacja utworzy dużą liczbę blokad strony: 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 zostać wprowadzone przez to zapytanie akcji.

Przyczyna

Blokady strony wymagane dla transakcji przekraczają wartość MaxLocksPerFile, która domyślnie wynosi 9500 blokad. Parametr MaxLocksPerFilesetting jest przechowywany w rejestrze systemu Windows.

Rozwiązanie

Ważna

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 dotyczących wykonywania 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 wykonać kopię zapasową rejestru i przywrócić go w systemie Windows

Istnieje kilka sposobów obejścia tego problemu:

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

Metoda 1. Zmiana pliku MaxLocksPerFile w rejestrze

Użyj Redaktor rejestru, aby zwiększyć wartość MaxLocksPerFile pod następującym kluczem:

W przypadku programu Microsoft Access 2000 w programie Microsoft Access 2002 i w programie Microsoft Office Access 2003, które są uruchomione w 32-bitowym systemie operacyjnym Windows:

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

W przypadku programu Microsoft Access 2000 w programie Microsoft Access 2002 i w programie Microsoft Office Access 2003, które są uruchomione 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 Microsoft Access 2010 uruchomionych 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 Microsoft Access 2013 uruchomionych 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 Access 2016 firmy Microsoft działającego w 32-bitowym systemie operacyjnym Windows:

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

W przypadku pakietu Microsoft Office Access 2016, który działa w 64-bitowym systemie operacyjnym Windows:

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

Należy pamiętać , że ta metoda zmienia ustawienie rejestru dla wszystkich aplikacji korzystających z aparatu bazy danych Microsoft Jet w wersji 4.0.

Metoda 2. Tymczasowe zmienianie parametru MaxLocksPerFile przy użyciu metody SetOption

Uwaga

Przykładowy kod w tym artykule używa obiektów programu Microsoft Data Access. Aby ten kod działał prawidłowo, należy odwołać się do biblioteki obiektów microsoft DAO 3.6. W tym celu kliknij pozycję Odwołania w menu Narzędzia w Redaktor Visual Basic i upewnij się, że wybrano pole wyboru Biblioteka obiektów dao 3.6 firmy Microsoft.

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. SetOptionmethod tymczasowo zastępuje wartości kluczy aparatu bazy danych Microsoft Jet w rejestrze. Nowa wartość pozostaje w mocy, dopóki nie zmienisz jej ponownie lub do momentu zamknięcia obiektu DBEngine.

Uwaga

Zmiany wprowadzone w obiekcie MaxLocksPerFilesetting przy użyciu metody SetOption będą dostępne tylko w bieżącej sesji obiektów dostępu do danych (DAO). Zapytania uruchamiane za pośrednictwem 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 w zapytaniu akcji

Jeśli zapytanie akcji przechowywanej powoduje błąd, można ustawić jego właściwość UseTransaction na wartość Nie. Należy pamiętać, że w takim przypadku nie można wycofać zmian w przypadku wystąpienia problemu lub błędu podczas uruchamiania zapytania:

  1. Otwórz zapytanie w widoku projektu.
  2. W menu Widok kliknij pozycję 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 właściwość UseTransactionproperty na wartość Nie.
  5. Zapisz zapytanie i zamknij je.

Więcej informacji

Funkcja MaxLocksPerFilesetting w rejestrze uniemożliwia transakcjom w aparacie bazy danych Microsoft Jet przekroczenie określonej wartości. Jeśli transakcja próbuje utworzyć blokady przekraczające wartość MaxLocksPerFile, transakcja zostanie podzielona na co najmniej dwie części i częściowo zatwierdzona.

Kroki prowadzące do odtworzenia problemu

W poniższym przykładzie użyto procedury języka Visual Basic do utworzenia tabeli z 10 000 rekordów, a następnie zmodyfikowania tabeli w celu wywołania komunikatu o błędzie:

  1. Otwórz przykładową Northwind.mdb bazy danych.
  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 Natychmiastowe, a następnie naciśnij klawisz ENTER:

    CreateBigTable
    

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

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

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

  4. Zmień wartość pola FieldSizeproperty pola Field4 na 253.

  5. Zapisz tabelę. Po wyświetleniu monitu o utratę niektórych danych kliknij przycisk Tak.

    Pamiętaj, że po chwili otrzymujesz 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.