web-dev-qa-db-fra.com

Erreur "L'opération doit utiliser une requête pouvant être mise à jour" dans MS Access

Je reçois un message d'erreur: "L'opération doit utiliser une requête pouvant être mise à jour" lorsque j'essaie d'exécuter mon code SQL. À ma connaissance, cela se produit lorsque des jointures sont utilisées dans des requêtes de mise à jour/suppression dans MS Access. Cependant, je suis un peu confus parce que j'ai une autre requête presque identique dans ma base de données qui fonctionne bien.

Ceci est ma requête gênante:

UPDATE [GS] INNER JOIN [Views] ON 
    ([Views].Hostname = [GS].Hostname) 
    AND ([GS].APPID = [Views].APPID) 
    SET 
        [GS].APPID = [Views].APPID, 
        [GS].[Name] = [Views].[Name], 
        [GS].Hostname = [Views].Hostname, 
        [GS].[Date] = [Views].[Date], 
        [GS].[Unit] = [Views].[Unit], 
        [GS].[Owner] = [Views].[Owner];

Comme je l'ai dit précédemment, je suis confus parce que j'ai une autre requête similaire à celle-ci, qui fonctionne parfaitement. C'est cette requête:

UPDATE [Views] INNER JOIN [GS] ON 
[Views].APPID = [GS].APPID 
SET 
    [GS].APPID = [Views].APPID, 
    [GS].[Name] = [Views].[Name], 
    [GS].[Criticial?] = [Views].[Criticial?], 
    [GS].[Unit] = [Views].[Unit], 
    [GS].[Owner] = [Views].[Owner];

Quel est le problème avec ma première requête? Pourquoi la seconde requête fonctionne-t-elle quand la première ne fonctionne pas?

23
Andrew Martin

Je ne sais pas si cette réponse est universellement vraie ou non, mais j'ai résolu ce problème en modifiant légèrement ma requête.

Plutôt que de joindre une requête de sélection à une table et de la traiter, j'ai modifié la requête de sélection pour créer une table temporaire. J'ai ensuite utilisé cette table temporaire pour la vraie table et tout fonctionnait parfaitement.

19
Andrew Martin

Il n'y a pas d'erreur dans le code, mais l'erreur est générée pour les raisons suivantes:

 - Please check whether you have given Read-write permission to MS-Access database file.
 - The Database file where it is stored (say in Folder1) is read-only..? 

supposons que la base de données (fichier MS-Access) soit stockée dans un dossier en lecture seule. Lors de l'exécution de votre application, la connexion n'est pas forcée. Par conséquent, changez l’autorisation du fichier/son autorisation du dossier contenant comme dans C:\Program files presque tous les fichiers du lecteur c été configurés lecture seule donc modifier cette autorisation résout ce problème.

20

J'ai eu la même erreur quand essayait de mettre à jour la table liée.

Le problème était que la table liée n'avait pas de clé primaire.

Après l’ajout de la contrainte de clé primaire côté base de données et la nouvelle liaison de cette table à un problème d’accès, le problème a été résolu.

J'espère que ça va aider quelqu'un.

13
Almazini

J'ai eu exactement le même problème, et je ne me souviens plus comment j'aimais cette solution, mais le simple fait d'ajouter DISTINCTROW a résolu le problème.

Dans votre code, cela ressemblera à ceci:

UPDATE DISTINCTROW [GS] INNER JOIN [Views] ON <- the only change is here
    ([Views].Hostname = [GS].Hostname) 
    AND ([GS].APPID = [Views].APPID) 
 ...

Je ne sais pas pourquoi cela fonctionne, mais pour moi, il a fait exactement ce dont j'avais besoin.

10
EBH

définir l'autorisation sur le répertoire de l'application pour résoudre ce problème avec moi

Pour définir cette autorisation, cliquez avec le bouton droit de la souris sur le dossier App_Data (ou sur tout autre dossier dans lequel vous avez placé le fichier) et sélectionnez Propriétés. Recherchez l'onglet Sécurité. Si vous ne le voyez pas, vous devez accéder à Poste de travail, cliquer sur Outils, choisir Options des dossiers, puis cliquer sur l'onglet Affichage. Faites défiler vers le bas et décochez "Utiliser le partage de fichiers simple (recommandé)". De retour dans l'onglet Sécurité, vous devez ajouter le compte correspondant à la zone Noms de groupes ou d'utilisateurs. Cliquez sur Ajouter .... puis sur Avancé, puis sur Rechercher maintenant. Le compte approprié doit être répertorié. Double-cliquez dessus pour l'ajouter à la zone Noms d'utilisateur ou de groupe, puis cochez l'option Modifier dans les autorisations. C'est ça. Vous avez terminé.

3
E R

Pour mettre à jour les enregistrements, vous devez écrire les modifications dans le fichier .mdb sur le disque. Si votre application Web/partagée ne peut pas écrire sur le disque, vous ne pouvez pas mettre à jour les enregistrements existants ni en ajouter de nouveaux. Donc, activez l'accès en lecture/écriture dans le dossier de la base de données ou déplacez la base de données vers un autre dossier où votre application dispose de l'autorisation en écriture. Pour plus de détails, veuillez vérifier:

http://www.beansoftware.com/ASP.NET-FAQ/Operation-Must-Use-An-Updateable-Query.aspx

2
Mujahed

J'accédais à la base de données en utilisant le chemin UNC et occasionnellement, cette exception était levée. Lorsque j'ai remplacé le nom de l'ordinateur par l'adresse IP, le problème a été résolu soudainement.

1
MartinVotruba

J'ai utilisé une table temporaire et j'ai finalement réussi à le faire fonctionner. Voici la logique utilisée une fois que vous avez créé la table temporaire:

UPDATE your_table, temp
SET your_table.value = temp.value
WHERE your_table.id = temp.id
1
kjmerf

J'ai eu la même erreur et l'utilisation d'une clé primaire n'a pas fait de différence. Le problème était que la table est une table Excel liée. Je sais qu'il existe des paramètres pour changer cela, mais mon service informatique l'a verrouillé pour que nous ne puissions pas le changer. Au lieu de cela, j'ai créé une table make à partir de la table liée et je l'ai utilisée à la place dans ma requête de mise à jour et cela a fonctionné. Notez que toutes les requêtes de votre requête qui sont également liées à la même table liée Excel entraînent la même erreur. Vous devrez donc les modifier également afin qu'elles ne soient pas directement liées à la table liée Excel. HTH

0
Derek

C'est un coup dans le noir, mais essayez de mettre les deux opérandes pour AND entre parenthèses

Sur ((A = B) et (C = D))

0
garaber