Error "No hay suficiente espacio en disco ni memoria" al realizar una operación en una tabla de Access

Avanzado: requiere conocimientos expertos de codificación, interoperabilidad y multiusuario.

Este artículo solo se aplica a una base de datos de Microsoft Access (.mdb).

Síntomas

Al realizar una operación en una tabla, puede recibir el siguiente mensaje de error si la operación crea un gran número de bloqueos de página: No hay suficiente espacio en disco ni memoria.

Si ejecuta una consulta de acción en una tabla grande, puede recibir el siguiente mensaje de error: No hay suficiente espacio en disco ni memoria para deshacer los cambios de datos que esta consulta de acción está a punto de realizar.

Causa

Los bloqueos de página necesarios para la transacción superan el valor MaxLocksPerFile, que tiene como valor predeterminado 9500 bloqueos. MaxLocksPerFilesetting se almacena en el Registro de Windows.

Solución

Importante

Esta sección, método o tarea contiene pasos que le indican cómo modificar el Registro. No obstante, pueden producirse problemas graves si modifica el registro de manera incorrecta. En consecuencia, asegúrese de seguir estos pasos cuidadosamente. Para mayor protección, cree una copia de seguridad del registro antes de modificarlo. Después, puede restaurar el registro si se produce un problema. Para obtener más información acerca de cómo realizar una copia de seguridad y restaurar el Registro, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

322756 Hacer una copia de seguridad del Registro y restaurarlo en Windows

Hay varias maneras de solucionar este problema:

  • Puede usar Regedit.exe para editar el Registro y cambiar el valor MaxLocksPerFile de forma permanente.
  • Puede usar el método SetOption del objeto DBEngine para cambiar el valor MaxLocksPerFile de forma temporal en el código.
  • Si el error se produce al ejecutar una consulta de acción, puede modificar la consulta y establecer su propiedad UseTransaction en No.

Método 1: Cambiar MaxLocksPerFile en el Registro

Use Editor del Registro para aumentar el valor de MaxLocksPerFile en la clave siguiente:

Para Microsoft Access 2000, en Microsoft Access 2002 y en Microsoft Office Access 2003 que se ejecutan en un sistema operativo Windows de 32 bits:

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

Para Microsoft Access 2000, en Microsoft Access 2002 y en Microsoft Office Access 2003 que se ejecutan en un sistema operativo Windows de 64 bits:

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

Para Microsoft Office Access 2007 que se ejecuta en un sistema operativo Windows de 32 bits:

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

Para Microsoft Office Access 2007 que se ejecuta en un sistema operativo Windows de 64 bits:

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

Para Microsoft Access 2010 que se ejecuta en un sistema operativo Windows de 32 bits:

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

Para Microsoft Office Access 2010 que se ejecuta en un sistema operativo Windows de 64 bits:

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

Para Microsoft Access 2013 que se ejecuta en un sistema operativo Windows de 32 bits:

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

Para Microsoft Office Access 2013 que se ejecuta en un sistema operativo Windows de 64 bits:

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

Para Microsoft Access 2016 que se ejecuta en un sistema operativo Windows de 32 bits:

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

Para Microsoft Office Access 2016 que se ejecuta en un sistema operativo Windows de 64 bits:

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

Tenga en cuenta que este método cambia la configuración del Registro para todas las aplicaciones que usan la versión 4.0 del motor de base de datos de Microsoft Jet.

Método 2: Usar SetOption para cambiar MaxLocksPerFile temporalmente

Nota:

En el código de ejemplo de este artículo se usan objetos de Microsoft Data Access. Para que este código se ejecute correctamente, debe hacer referencia a la biblioteca de objetos de Microsoft DAO 3.6. Para ello, haga clic en Referencias en el menú Herramientas del Editor de Visual Basic y asegúrese de que la casilla Biblioteca de objetos de Microsoft DAO 3.6 esté activada.

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía, ya sea expresa o implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. Se considera que está familiarizado con el lenguaje de programación que se muestra y con las herramientas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos adaptados a sus necesidades específicas. El método SetOption invalida temporalmente los valores de las claves del motor de base de datos de Microsoft Jet en el Registro. El nuevo valor permanece en vigor hasta que se vuelve a cambiar o hasta que se cierra el objeto DBEngine.

Nota:

Los cambios realizados en MaxLocksPerFilesetting mediante el método SetOption solo estarán disponibles a través de la sesión actual de Objetos de acceso a datos (DAO). Las consultas que se ejecutan a través de la interfaz de usuario de Microsoft Access seguirán usando la configuración del Registro.

El ejemplo de código siguiente establece MaxLocksPerFile en 200 000 antes de ejecutar una operación de actualización dentro de una transacción:

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

Método 3: Establecer la propiedad UseTransaction en una consulta de acción

Si una consulta de acción almacenada produce el error, puede establecer su propiedad UseTransaction en No. Tenga en cuenta que, si lo hace, no puede revertir los cambios si hay un problema o un error mientras se ejecuta la consulta:

  1. Abra la consulta en la vista Diseño.
  2. En el menú Ver, haga clic en Propiedades.
  3. Haga clic en un espacio vacío en la mitad superior de la ventana de consulta para mostrar el cuadro de diálogo Propiedades de consulta.
  4. Establezca la propiedad UseTransaction en No.
  5. Guarde la consulta y ciérrela.

Más información

MaxLocksPerFilesetting en el Registro impide que las transacciones del motor de base de datos de Microsoft Jet superen un valor especificado. Si una transacción intenta crear bloqueos por encima del valor MaxLocksPerFile, la transacción se divide en dos o más partes y se confirma parcialmente.

Pasos para reproducir el problema

En el ejemplo siguiente se usa un procedimiento de Visual Basic para crear una tabla con 10 000 registros y, a continuación, se modifica la tabla para provocar el mensaje de error:

  1. Abra la Northwind.mdb de base de datos de ejemplo.
  2. Cree un módulo y escriba el procedimiento siguiente:
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. Para ejecutar el procedimiento, escriba la línea siguiente en la ventana Inmediato y presione ENTRAR:

    CreateBigTable
    

    El procedimiento crea una tabla denominada BigTable con 10 000 registros.

  2. Guarde el módulo como Module1 y ciérrelo.

  3. Abra la tabla BigTable en la vista Diseño.

  4. Cambie la propiedad FieldSize de Field4 a 253.

  5. Guarde la tabla. Haga clic en Sí cuando se le pida que se pierdan algunos datos.

    Tenga en cuenta que, después de un tiempo, recibirá los siguientes mensajes de error:

    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.