none
L'opération doit utiliser une requête qui peut être mise à jour

    Question

  • Bonjour

    Lors de la mise à jour d'une table j'ai le message suivant:

    L'opération doit utiliser une requête qui peut être mise à jour

    La requête utilisée est la suivante:

    var query = "UPDATE tblLR " +
                           "SET Location = '" + com + "' " +
                           ", SortedLocation = '" + com + "' " +
                           ", ShortName= '" + topLegacy.ShortName.Replace("'""''"+ "' " +
                           ", Latitude = '" + topLegacy.Latitude + "' " +
                           ", Longitude = '" + topLegacy.Longitude + "' " +
                           " WHERE (IDLR = " + topLegacy.Idlr + " );";

    Ou IDLR est la clé unique de la table.

    Ce qui est très étrange est que l'erreur ne se fait que sur certains enregistrements et de façon plus ou moins aléatoire. Je veux dire que quand je lance mon programme plusieurs fois ceux ne sont pas toujours les mêmes enregistrements qui occasionnent l'erreur.

    J'ai consulté 

    https://support.microsoft.com/fr-fr/help/328828/how-to-troubleshoot-errors-that-may-occur-when-you-update-data-in-acce

    mais n'y est pas trouvé la solution.

    Merci pour votre aide.

    Bernard


    Bernard Bouree

    lundi 11 décembre 2017 16:37

Réponses

  • J'utilise une base Access généré par un tiers et je n'ai donc pas la possibilité d'utiliser SqlServeur que je connais un peu.

    Avec SQL Server est proposé un outil de migration, pour transférer les données d'une base Access vers une base SQL Server. Je crois bien que l'inverse existe aussi, mais est beaucoup moins utilisé.

    • Marqué comme réponse BernardBouree vendredi 15 décembre 2017 21:00
    jeudi 14 décembre 2017 15:45

Toutes les réponses

  • Bonjour Bernard,
    J'espère que l'article suivant vous sera utile:
    PROBLÈME : ASP renvoie une erreur 'L'opération doit utiliser une requête qui peut être mise à jour'

    Cordialement,
    Nina

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 12 décembre 2017 15:04
    Modérateur
  • Bonjour Nina

    J'avais vu cet article, mais il ne répond pas à mon problème car les causes mentionnées impactent tous les enregistrements de la base .

    Or dans mon cas 1) seuls une toute petite partie des enregistrements provoquent cette erreurs et ceux ne sont pas les mêmes à chaque exécution !, 2) J'ai juste une seule table avec un clé sans groupe, liens, unions etc.

    Cordialement

    Bernard


    Bernard Bouree

    mardi 12 décembre 2017 15:59
  • Bonjour,

    Il y a effectivement de quoi être perplexe.

    De quelle type de base de données s'agit-il ?

    Y a-t-il plusieurs utilisateurs à y accéder en même temps ?

    A priori, on suppose que tblLR est une table sur laquelle l'utilisateur qui fait tourner l'application a tous les droits. Est-ce bien le cas ? Si c'est ça on peut trouver le message pas très précis, mais ça ne serait pas la première fois (et sur plus d'une plate-forme).

    Il n'y a pas d'utilisation de vues dans la base ?

    mercredi 13 décembre 2017 16:53
  • Bonjour

    C'est une base Access classique avec plusieurs tables.

    Ma requête ne met à jour qu'une seule table.

    La base est sur mon PC et je suis le seul utilisateur.

    Oui j'ai tous les droits.

    Merci pour votre aide

    Bernard Bouree

    jeudi 14 décembre 2017 09:20
  • Bonjour,

    Ah, oui, une base Access ...

    Ce n'est pas le plus facile à gérer, les technologies .Net n'existaient pas lors de la création d'Access.

    En corollaire existent un certain nombre de difficultés, comme par exemple si on passe des paramètres à une requête, ils ne peuvent pas être repérés par leurs noms, mais seulement par leurs numéros d'ordre parmi les paramètres.

    Là, on ne parle pas de paramètres, mais une difficulté du même ordre peut se trouver sur le chemin.

    Y a-t-il moyen d'essayer une procédure enregistrée ?

    Du coup on va se retrouver, comme je le disais, avec le problème des paramètres : il faut faire bien attention à leur ordre, car c'est le seul moyen par lequel Access va les distinguer.

    Dans la mesure où le problème n'apparaît que de temps à autre, une solution proposée "pour essayer" va être difficile à évaluer, mais ... c'est tout ce que j'ai en magasin :)

    A part d'installer SQL Express, qui est gratuit, dans la mesure où les possibilités de la version Express suffisent pour le projet, mais de toute manière il ne me semble pas qu'Access aille bien plus loin.

    Bien sûr, si on va par là, il y aura un petit temps d'adaptation pour assimiler quelques points de syntaxe, mais ça risque de s'avérer vite payant, sauf si on n'envisage de développer qu'un seul projet et qu'il est bientôt terminé.

    Un point à vérifier pour l'apparition des problèmes de mise à jour ou création d'enregistrements (apparemment rien à voir avec l'intitulé du message d'erreur, mais ça ne coûte rien de vérifier) : la présence dans les intitulés de caractères particuliers, notamment les apostrophes, les guillemets, les caractères accentués.

    • Modifié Gloops jeudi 14 décembre 2017 15:27
    jeudi 14 décembre 2017 15:20
  • Bonjour

    J'utilise une base Access généré par un tiers et je n'ai donc pas la possibilité d'utiliser SqlServeur que je connais un peu.

    Peut-on avoir une procédure enregistrée sous Access ?

    Vous parlez de l'ordre des paramètres. Dans quel ordre doivent-ils être passés? Ma requête ci-dessus liste les champs dans l'ordre de leur définition dans la table Access.

    Depuis j'ai essayé de mettre au point des paramètres mais je bute sur une erreur de type. J'ai posé une question sur le forum à ce sujet.

    Merci


    Bernard Bouree

    jeudi 14 décembre 2017 15:30
  • Il va falloir faire une recherche web sur le sujet des procédures stockées sous Access : ça permettra à la fois de savoir comment en créer une, comment y placer des paramètres, comment les passer lors de l'appel.

    Si j'essaie d'improviser ça ici je vais y mettre du temps et je ne serai pas forcément aussi clair, surtout que je n'ai plus touché à Access depuis un moment.

    Je pars du principe qu'on trouve encore ça en ligne, ce que je n'ai pas vérifié à l'instant.

    A noter que d'une manière générale, l'usage de procédures stockées est recommandé, surtout pour une application web, où elles permettent de limiter certaines modifications frauduleuses en ligne (car il y a des gens que ça amuse beaucoup). Du reste pour en tirer tout le bénéfice il est recommandé que l'application web ne soit autorisée à accéder à la base que par procédures stockées.

    jeudi 14 décembre 2017 15:40
  • Depuis j'ai essayé de mettre au point des paramètres mais je bute sur une erreur de type. J'ai posé une question sur le forum à ce sujet.

    Quel genre d'erreur ?

    Je soupçonne que je vais entendre parler de dates ... ?

    jeudi 14 décembre 2017 15:43
  • J'utilise une base Access généré par un tiers et je n'ai donc pas la possibilité d'utiliser SqlServeur que je connais un peu.

    Avec SQL Server est proposé un outil de migration, pour transférer les données d'une base Access vers une base SQL Server. Je crois bien que l'inverse existe aussi, mais est beaucoup moins utilisé.

    • Marqué comme réponse BernardBouree vendredi 15 décembre 2017 21:00
    jeudi 14 décembre 2017 15:45
  • Bonsoir

    Mistère, mistère!!

    J'ai modifié mon code pour mettre des paramètres et maintenant je n'ai plus de problème!!

    var query = "UPDATE tblLR " +
                           "SET Location = @location " +
                           ", SortedLocation = @sortedLocation" +
                           ", Latitude = @latitude" +
                           ", Longitude = @longitude " +
                           " WHERE IDLR = @idLr";
     
             
               var dBcon = new OleDbConnection(Legacy.ConString);
               var cmd = new OleDbCommand(query, dBcon);
               cmd.Parameters.Add("@idLr"OleDbType.BigInt).Value = topLegacy.Idlr;
               cmd.Parameters.Add("@location",OleDbType.VarChar).Value= topLegacy.Location.Replace("'""''");
               cmd.Parameters.Add("@sortedLocation"OleDbType.VarChar).Value = topLegacy.Location.Replace("'""''");
               cmd.Parameters.Add("@shortName"OleDbType.VarChar).Value = topLegacy.ShortName.Replace("'""''");
               cmd.Parameters.Add("@latitude"OleDbType.Double).Value = topLegacy.Latitude;
               cmd.Parameters.Add("@longitude"OleDbType.Double).Value = topLegacy.Longitude;

    Merci pour votre aide

    Bernard


    Bernard Bouree

    vendredi 15 décembre 2017 20:59
  • En lisant ça j'ai cru que c'était sous Access, je me suis dit qu'Access avait évolué.

    Et puis en venant j'ai vu ce qui était marqué comme solution :)

    En plus avec SQL Server on reste chez Microsoft, ça serait dommage que ça coince.

    Bon, si il n'y a plus de problème, tant mieux.

    samedi 16 décembre 2017 23:28
  • Bonjour

    Non, il s'agit bien d'une requête interrogeant une base ACCESS !

    Beranrd


    Bernard Bouree

    dimanche 17 décembre 2017 08:27
  • Alors, c'est que ça a changé : j'ai passé du temps à passer des paramètres nommés à Access, ça ne passait pas. Il y a eu un certain nombre de nouvelles versions, depuis.

    Si c'est ça, marquer comme solution l'outil de migration vers SQL Server prête à confusion, non ?

    dimanche 17 décembre 2017 11:22