Symptômes Lorsque vous utilisez ActiveX Data Objects (ADO) avec Active Server Pages (ASP), vous pouvez rencontrer les erreurs courantes suivantes :
Erreur du fournisseur Microsoft OLE DB pour les pilotes ODBC « 80004005 »
[Microsoft][Pilote ODBC Microsoft Access 97] L'opération doit utiliser une requête pouvant être mise à jour.
Cause Cet article décrit les quatre causes principales de cette erreur et les solutions de contournement correspondantes. Bien que cet article traite des bases de données Microsoft Access, les informations fournies ici s'appliquent également à d'autres types de bases de données.
Solution Vous rencontrez généralement cette erreur lorsque votre script tente d'effectuer une mise à jour ou d'effectuer une autre action modifiant les informations dans la base de données. Cette erreur se produit car ADO ne peut pas écrire dans la base de données pour l'une des raisons suivantes :
1. La raison la plus courante est que le compte invité Internet (IUSR_MACHINE, qui appartient par défaut au groupe « Tout le monde ») n'a pas accès au fichier de base de données. (.mdb) Autorisation d'écriture. Pour résoudre ce problème, utilisez l'onglet Sécurité de l'Explorateur pour ajuster les propriétés de ce fichier afin que le compte Invité Internet dispose des autorisations appropriées.
Remarque : lorsque vous utilisez une base de données Microsoft Access avec ADO, vous devez également accorder au compte Invité Internet des autorisations d'écriture sur le répertoire contenant le fichier .mdb. En effet, Jet crée un fichier .ldb qui gère le verrouillage de la base de données. Étant donné que Jet peut créer des fichiers temporaires dans le répertoire « Temp », vous devrez peut-être également accorder des autorisations de lecture/écriture sur ce dossier.
2. La deuxième raison de cette erreur est que la base de données n'a pas été ouverte dans le bon mode avec les autorisations d'écriture. Si vous effectuez une opération Open sur un objet Connection, vous devez utiliser la propriété Mode pour indiquer les autorisations dont vous disposez sur la connexion, comme suit :
SQL = "UPDATE Products Set UnitPrice = 2;"
Définir Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = 3 '3 = adModeReadWrite
Conn.Ouvrir "myDSN"
Conn.Execute(SQL)
Conn.Fermer
Remarque : Par défaut, MODE est défini sur 0 (adModeUnknown), ce qui autorise généralement les mises à jour.
3. Une autre raison de cette erreur est que dans l'Administrateur ODBC, le paramètre « Lecture seule » dans la page « Options » du DSN peut être sélectionné.
4. Le dernier problème et la solution de contournement s'appliquent à toutes les sources de données SQL. Les instructions SQL qui violent l'intégrité référentielle de la base de données peuvent provoquer cette erreur. Voici quelques-unes des requêtes ayant échoué les plus courantes :
• L'ensemble de requêtes le plus simple est celui que vous ne pouvez pas modifier : requêtes d'analyse croisée, requêtes directes SQL, requêtes d'union ou requêtes d'opération de mise à jour (c'est-à-dire de création de table) dont la propriété UniqueValue est définie sur Oui.
• Une autre raison très courante est que la jointure contient des index sur des tables ODBC liées qui ne sont pas uniques. Dans ce cas, SQL ne peut pas garantir que les enregistrements de la table soient uniques et les valeurs des champs de la table changeront avec la requête.
• Il y a une raison pour laquelle il existe effectivement une alternative fiable. Si vous essayez de mettre à jour un champ de jointure du côté « un » d'une requête « un-à-plusieurs », l'opération échouera à moins que vous n'activiez les mises à jour en cascade. Parce qu'alors vous pouvez déléguer l'intégrité référentielle au moteur JET.