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:
- Abra la consulta en la vista Diseño.
- En el menú Ver, haga clic en Propiedades.
- 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.
- Establezca la propiedad UseTransaction en No.
- 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:
- Abra la Northwind.mdb de base de datos de ejemplo.
- 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
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.
Guarde el módulo como Module1 y ciérrelo.
Abra la tabla BigTable en la vista Diseño.
Cambie la propiedad FieldSize de Field4 a 253.
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.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de