Ошибка "Недостаточно места на диске или памяти" при выполнении операции с таблицей Access

Дополнительно: требуются экспертные навыки программирования, взаимодействия и многопользовательских навыков.

Эта статья относится только к базе данных Microsoft Access (.mdb).

Симптомы

При выполнении операции с таблицей может появилось следующее сообщение об ошибке, если операция создает большое количество блокировок страниц: Недостаточно места на диске или памяти.

При выполнении запроса на действие для большой таблицы может появиться следующее сообщение об ошибке: Недостаточно места на диске или памяти для отмены изменений данных, которые этот запрос действия внесет.

Причина

Блокировки страниц, необходимые для транзакции, превышают значение MaxLocksPerFile, которое по умолчанию составляет 9500 блокировок. MaxLocksPerFilesetting хранится в реестре Windows.

Разрешение

Важно!

В этот раздел, описание метода или задачи включены действия, содержащие указания по изменению параметров реестра. Однако неправильное изменение параметров реестра может привести к возникновению серьезных проблем. Поэтому следует в точности выполнять приведенные инструкции. Для дополнительной защиты создайте резервную копию реестра, прежде чем редактировать его. Так вы сможете восстановить реестр, если возникнет проблема. Дополнительные сведения о создании резервной копии и восстановлении реестра см. в соответствующей статье базы знаний Майкрософт:

322756 Как создать резервную копию и восстановить реестр в Windows

Эту проблему можно обойти несколькими способами:

  • Вы можете использовать Regedit.exe для изменения реестра и постоянного изменения значения MaxLocksPerFilevalue.
  • Можно использовать Метод SetOptionmethod объекта DBEngine, чтобы временно изменить значение MaxLocksPerFilevalue в коде.
  • Если ошибка возникает при выполнении запроса на действие, можно изменить запрос и задать для этого запроса значение UseTransactionproperty значение Нет.

Способ 1. Изменение MaxLocksPerFile в реестре

Используйте Редактор реестра, чтобы увеличить значение MaxLocksPerFile в следующем разделе:

Для Microsoft Access 2000, в Microsoft Access 2002 и Microsoft Office Access 2003, работающих в 32-разрядной операционной системе Windows:

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

Для Microsoft Access 2000, в Microsoft Access 2002 и Microsoft Office Access 2003, работающих в 64-разрядной операционной системе Windows:

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

Для Microsoft Office Access 2007, работающей в 32-разрядной операционной системе Windows:

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

Для Microsoft Office Access 2007, работающей в 64-разрядной операционной системе Windows:

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

Для Microsoft Access 2010, русская версия, работающих в 32-разрядной операционной системе Windows:

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

Для Microsoft Office Access 2010, работающей в 64-разрядной операционной системе Windows:

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

Для Microsoft Access 2013, работающих в 32-разрядной операционной системе Windows:

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

Для Microsoft Office Access 2013, работающей в 64-разрядной операционной системе Windows:

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

Для microsoft Access 2016, работающей в 32-разрядной операционной системе Windows:

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

Для Microsoft Office Access 2016, работающих в 64-разрядной операционной системе Windows:

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

Обратите внимание , что этот метод изменяет параметр реестра для всех приложений, использующих ядро СУБД Microsoft Jet версии 4.0.

Способ 2. Временное изменение MaxLocksPerFile с помощью SetOption

Примечание.

В примере кода в этой статье используются объекты Доступа к данным Майкрософт. Для правильного выполнения этого кода необходимо ссылаться на библиотеку объектов Microsoft DAO 3.6. Для этого щелкните Ссылки в меню Сервис в Редактор Visual Basic и убедитесь, что выбрано поле Библиотека объектов Microsoft DAO 3.6 проверка.

Корпорация Майкрософт предоставляет примеры программирования только в целях демонстрации без явной или подразумеваемой гарантии. Данное положение включает, но не ограничивается этим, подразумеваемые гарантии товарной пригодности или соответствия отдельной задаче. Эта статья предполагает, что пользователь знаком с представленным языком программирования и средствами, используемыми для создания и отладки процедур. Специалисты технической поддержки Майкрософт могут пояснить работу той или иной процедуры, но модификация примеров и их адаптация к задачам разработчика не предусмотрена. SetOptionmethod временно переопределяет значения для разделов ядра СУБД Microsoft Jet в реестре. Новое значение остается в силе до тех пор, пока вы не измените его снова или пока объект DBEngine не будет закрыт.

Примечание.

Изменения, внесенные в MaxLocksPerFilesetting с помощью метода SetOption, будут доступны только через текущий сеанс объектов доступа к данным (DAO). Запросы, выполняемые через пользовательский интерфейс Microsoft Access, по-прежнему будут использовать параметры в реестре.

В следующем примере кода maxLocksPerFile устанавливается значение 200 000 перед выполнением операции обновления внутри транзакции:

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

Метод 3. Задание свойства UseTransaction в запросе к действию

Если ошибка вызвана хранимым запросом действия, можно задать для его свойства UseTransaction значение Нет. Обратите внимание, что в этом случае вы не сможете выполнить откат изменений, если во время выполнения запроса возникла проблема или ошибка:

  1. Откройте запрос в режиме конструктора.
  2. В меню Вид выберите пункт Свойства.
  3. Щелкните пустое место в верхней части окна запроса, чтобы открыть диалоговое окно Свойства запроса.
  4. Задайте для параметра UseTransactionproperty значение Нет.
  5. Сохраните запрос и закройте его.

Дополнительная информация

Параметр MaxLocksPerFilesetting в реестре предотвращает превышение указанного значения транзакций в ядре СУБД Microsoft Jet. Если транзакция пытается создать блокировки, превышающие значение MaxLocksPerFile, транзакция разбивается на две или несколько частей и частично фиксируется.

Действия по воспроизведению проблемы

В следующем примере используется процедура Visual Basic для создания таблицы с 10 000 записями в ней, а затем изменяет таблицу, чтобы вызвать сообщение об ошибке:

  1. Откройте пример Northwind.mdb базы данных.
  2. Создайте модуль и введите следующую процедуру:
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. Чтобы выполнить процедуру, введите следующую строку в окне Интерпретация и нажмите клавишу ВВОД:

    CreateBigTable
    

    Процедура создает таблицу с именем BigTable с 10 000 записями в ней.

  2. Сохраните модуль как Module1 и закройте его.

  3. Откройте таблицу BigTable в режиме конструктора.

  4. Измените свойство FieldSizeproperty поля Field4 на 253.

  5. Сохраните таблицу. Нажмите кнопку Да, когда появится запрос на потерю некоторых данных.

    Обратите внимание, что через некоторое время вы получите следующие сообщения об ошибках:

    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.