Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Avancé : nécessite des compétences de codage, d’interopérabilité et de multiutilisateur d’experts.
Cet article s’applique uniquement à une base de données Microsoft Access (.mdb).
Symptômes
Lorsque vous effectuez une opération sur une table, vous pouvez recevoir le message d’erreur suivant si l’opération crée un grand nombre de verrous de page : il n’y a pas suffisamment d’espace disque ou de mémoire.
Si vous exécutez une requête d’action sur une table volumineuse, vous pouvez recevoir le message d’erreur suivant : il n’y a pas suffisamment d’espace disque ou de mémoire pour annuler les modifications apportées aux données que cette requête d’action est sur le point d’effectuer.
La cause
Les verrous de page requis pour la transaction dépassent la valeur MaxLocksPerFile, qui est définie par défaut sur 9500 verrous. MaxLocksPerFilesetting est stocké dans le Registre Windows.
Résolution
Important
Cette section, méthode ou tâche contient des étapes qui vous indiquent comment modifier le registre. Cependant, des problèmes sérieux peuvent survenir si vous modifiez le registre de manière incorrecte. Par conséquent, veillez à suivre attentivement ces étapes. Pour une protection supplémentaire, sauvegardez le Registre avant de le modifier. Ensuite, vous pouvez restaurer le registre si un problème survient. Pour plus d’informations sur la sauvegarde et la restauration du Registre, consultez Comment sauvegarder et restaurer le Registre dans Windows.
Il existe plusieurs façons de contourner ce problème :
- Vous pouvez utiliser Regedit.exe pour modifier le Registre et modifier la valeur MaxLocksPerFilevalue définitivement.
- Vous pouvez utiliser SetOptionmethod de l’objet DBEngine pour modifier temporairement la valeur MaxLocksPerFilevalue dans le code.
- Si l’erreur se produit lorsque vous exécutez une requête d’action, vous pouvez modifier la requête et définir sa propriété UseTransactionproperty sur Non.
Méthode 1 : Modification de MaxLocksPerFile dans le Registre
Utilisez l’Éditeur de Registre pour augmenter la valeur MaxLocksPerFile sous la clé suivante :
Pour Microsoft Access 2000, dans Microsoft Access 2002 et dans Microsoft Office Access 2003 qui s’exécutent sur un système d’exploitation Windows 32 bits :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet 4.0
Pour Microsoft Access 2000, dans Microsoft Access 2002 et dans Microsoft Office Access 2003 qui s’exécutent sur un système d’exploitation Windows 64 bits :
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Jet 4.0
Pour Microsoft Office Access 2007 qui s’exécute sur un système d’exploitation Windows 32 bits :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\ACE
Pour Microsoft Office Access 2007 qui s’exécute sur un système d’exploitation Windows 64 bits :
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\ACE
Pour Microsoft Access 2010 qui s’exécute sur un système d’exploitation Windows 32 bits :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ACE
Pour Microsoft Office Access 2010 qui s’exécute sur un système d’exploitation Windows 64 bits :
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ACE
Pour Microsoft Access 2013 qui s’exécute sur un système d’exploitation Windows 32 bits :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\Access Connectivity Engine\Engines\ACE
Pour Microsoft Office Access 2013 qui s’exécute sur un système d’exploitation Windows 64 bits :
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines\ACE
Pour Microsoft Access 2016 qui s’exécute sur un système d’exploitation Windows 32 bits :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE
Pour Microsoft Office Access 2016 qui s’exécute sur un système d’exploitation Windows 64 bits :
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE
Notez que cette méthode modifie le paramètre de Registre pour toutes les applications qui utilisent le moteur de base de données Microsoft Jet version 4.0.
Méthode 2 : Utilisation de SetOption pour modifier Temporairement MaxLocksPerFile
Remarque
L’exemple de code de cet article utilise Microsoft Data Access Objects. Pour que ce code s’exécute correctement, vous devez référencer la bibliothèque d’objets Microsoft DAO 3.6. Pour ce faire, sélectionnez Références dans le menu Outils dans Visual Basic Editor, puis vérifiez que la case à cocher Bibliothèque d’objets Microsoft DAO 3.6 est activée.
Microsoft fournit des exemples de programmation à titre d’illustration uniquement, sans garantie expresse ou implicite. Cela inclut, sans y être limité, les garanties implicites de qualité marchande et d’adéquation à un usage particulier. Cet article considère que vous connaissez le langage de programmation présenté et les outils utilisés pour créer et déboguer des procédures. Les ingénieurs du support technique Microsoft peuvent vous aider à expliquer les fonctionnalités d’une procédure particulière, mais ils ne modifient pas ces exemples pour fournir des fonctionnalités ou des procédures de construction ajoutées pour répondre à vos besoins spécifiques. La SetOption
méthode remplace temporairement les valeurs des clés du moteur de base de données Microsoft Jet dans le Registre. La nouvelle valeur reste en vigueur jusqu’à ce que vous la modifiez à nouveau, ou jusqu’à ce que l’objet DBEngine soit fermé.
Remarque
Les modifications apportées à MaxLocksPerFilesetting à l’aide de la SetOption
méthode sont disponibles uniquement via la session actuelle d’objets d’accès aux données (DAO). Les requêtes exécutées via l’interface utilisateur Microsoft Access utilisent toujours les paramètres dans le Registre.
L’exemple de code suivant définit MaxLocksPerFile sur 200 000 avant d’exécuter une opération de mise à jour à l’intérieur d’une transaction :
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éthode 3 : Définition de la propriété UseTransaction dans une requête d’action
Si une requête d’action stockée provoque l’erreur, vous pouvez définir sa UseTransaction
propriété sur Non.
Remarque : Si vous le faites, vous ne pouvez pas restaurer vos modifications en cas de problème ou d’erreur pendant l’exécution de la requête.
- Ouvrez la requête en mode Création.
- Dans le menu Affichage, sélectionnez Propriétés.
- Sélectionnez un espace vide dans la moitié supérieure de la fenêtre de requête pour afficher la boîte de dialogue Propriétés de la requête.
- Définissez UseTransactionproperty sur Non.
- Enregistrez la requête et fermez-la.
Plus d’informations
Le MaxLocksPerFilesetting
registre empêche les transactions dans le moteur de base de données Microsoft Jet de dépasser une valeur spécifiée. Si une transaction tente de créer des verrous en plus de la valeur MaxLocksPerFile, la transaction est divisée en deux parties ou plus et partiellement validée.
Étapes pour reproduire le problème
L’exemple suivant utilise une procédure Visual Basic pour créer une table avec 10 000 enregistrements, puis modifie la table pour provoquer le message d’erreur :
- Ouvrez l’exemple de base de données Northwind.mdb.
- Créez un module, puis tapez la procédure suivante :
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
Pour exécuter la procédure, tapez la ligne suivante dans la fenêtre Exécution, puis appuyez sur Entrée :
CreateBigTable
La procédure crée une table appelée BigTable avec 10 000 enregistrements.
Enregistrez le module en tant que Module1, puis fermez-le.
Ouvrez la table BigTable en mode Création.
Remplacez FieldSizeproperty de Field4 par 253.
Enregistrez la table. Cliquez sur Oui lorsqu'on vous avertit que certaines données peuvent être perdues.
Notez que, après un certain temps, vous recevez les messages d’erreur suivants :
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.