Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Avanzado: requiere conocimientos de codificación, interoperabilidad y multiusuario expertos.
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 o 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 o 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.
Resolución
Importante
Esta sección, método o tarea contiene pasos que indican cómo modificar el registro. No obstante, pueden producirse problemas graves si modifica el registro de manera incorrecta. Por lo tanto, asegúrate de seguir estos pasos cuidadosamente. Para mayor protección, realice una copia de seguridad del registro antes de modificarlo. Luego, puedes restaurar el registro si ocurre un problema. Para obtener más información sobre cómo hacer una copia de seguridad y restaurar el registro, consulta Cómo hacer una copia de seguridad y restaurar el registro en Windows.
Hay varias maneras de solucionar este problema:
- Puede usar Regedit.exe para editar el registro y cambiar maxLocksPerFilevalue de forma permanente.
- Puede usar el setOptionmethod del objeto DBEngine para cambiar el valor MaxLocksPerFilevalue temporalmente en el código.
- Si se produce el error al ejecutar una consulta de acción, puede modificar la consulta y establecer su propiedad UseTransaction en No.
Método 1: Cambio de MaxLocksPerFile en el Registro
Use el Editor del Registro para aumentar el valor MaxLocksPerFile en la siguiente clave:
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:
El código de ejemplo de este artículo usa 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, seleccione 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 propósito específico. En este artículo se da por supuesto que está familiarizado con el lenguaje de programación que se muestra y con las herramientas empleadas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden ayudar a explicar la funcionalidad de un procedimiento determinado, pero no modificarán estos ejemplos para proporcionar funcionalidad o procedimientos de construcción agregados para satisfacer sus requisitos específicos. El SetOption
método 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 vuelva a cambiarlo o hasta que se cierre el objeto DBEngine.
Nota:
Los cambios realizados en MaxLocksPerFilesetting mediante el SetOption
método solo está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 siguen 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: Establecimiento de la propiedad UseTransaction en una consulta de acción
Si una consulta de acción almacenada produce el error, puede establecer su UseTransaction
propiedad en No.
Nota: 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, seleccione Propiedades.
- Seleccione 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érrala.
Información adicional
El 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 que superan el valor de 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 en él y, a continuación, se modifica la tabla para provocar el mensaje de error:
- Abra la base de datos de ejemplo Northwind.mdb.
- 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 siguiente línea en la ventana Inmediato y presione ENTRAR:
CreateBigTable
El procedimiento crea una tabla denominada BigTable con 10 000 registros en ella.
Guarde el módulo como Module1 y, a continuación, ciérralo.
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 advierta que algunos datos podrían perderse.
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.