IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

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


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut L'opération doit utiliser une requête qui peut être mise à jour - aléatoire
    Bonjour

    J'ai cherché sur le web et sur ce forum les réponses à l'erreur cité en objet sans succès.

    J'ai une requête toute simple sur une seule table sans union ou regroupement ni liens et celle-ci me déclenche l'erreur ci-dessus pour une petite partie des enregistrements.
    De plus les enregistrements impactés ne sont pas toujours le mêmes à chaque exécution.
    Voici ma requête, si l'un de vous a une idée elle sera la bien venue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var query = "UPDATE tblLR " +
                            "SET Location = '" + com + "' " +
                            ", SortedLocation = '" + com + "' " +
                            ", ShortName= '" + topLegacy.ShortName.Replace("'", "''") + "' " +
                            ", Latitude = '" + topLegacy.Latitude + "' " +
                            ", Longitude = '" + topLegacy.Longitude + "' " +
                            " WHERE (IDLR = " + topLegacy.Idlr + " );";
    Merci
    Bernard

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 816
    Points : 14 909
    Points
    14 909
    Par défaut
    Bonjour,
    est-ce possible de voir le code complet ?
    Merci.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    Bonjour
    Bien sur , le voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    private static bool MettreAJourLegacy(ToponymeLegacy topLegacy, ToponymeGeoDb topGeoDb)
            {
                if (string.IsNullOrEmpty(topGeoDb.City))
                    return false;
     
                // Si le toponyme trouvé dans GeoDB est le même
                // pas de mise à jour
                if (TopLegacyEgalTopGeoDb(topLegacy, ref topGeoDb))
                    return false;
     
                if (GlobalConfig.RechercheStricte)
                {
                    if (topLegacy.Decodage.Interprete && !string.IsNullOrEmpty(topLegacy.Decodage.Etat))
                    {
                        var reponse = MessageBox.Show(topLegacy.Decodage.Etat, "Association à confimer",
                            MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (reponse == DialogResult.No)
                            return false;
                    }
                }
     
     
                CopierToponymeGeoDbDansLegacy(ref topLegacy, ref topGeoDb);
     
                var com = topLegacy.Location.Replace("'", "''");
     
                var query = "UPDATE tblLR " +
                            "SET Location = '" + com + "' " +
                            ", SortedLocation = '" + com + "' " +
                            ", ShortName= '" + topLegacy.ShortName.Replace("'", "''") + "' " +
                            ", Latitude = '" + topLegacy.Latitude + "' " +
                            ", Longitude = '" + topLegacy.Longitude + "' " +
                            " WHERE (IDLR = " + topLegacy.Idlr + " );";
     
     
                var dBcon = new OleDbConnection(Legacy.ConString);
                var cmd = new OleDbCommand(query, dBcon);
                using (dBcon)
                {
                    try
                    {
                        dBcon.Open();
                        cmd.ExecuteNonQuery();
                        return true;
                    }
                    catch (OleDbException ex)
                    {
                        string msg = ex.Message + "\n Erreur dans MettreAJourLegacy avec comme arguments: " +
                            "\n topLegacy =  " + topLegacy.Idlr + " " + topLegacy.ToString() +
                             "\n topGeoDB = "  + topGeoDb.ToString();
                        Program.ReportCrash(ex, msg);
                        MessageBox.Show(msg, "Erreur fatale dans la méthode MettreAJourLegacy()",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
                        return false;
                    }
                }
            }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    c'est plus du ressort du forum C# vb.net:

    https://www.developpez.net/forums/f4...ngages/vb-net/


    Ceci dit pourquoi ne pas utiliser les objets parameters avec l'objet command?

    https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
    Dernière modification par Invité ; 13/12/2017 à 17h11.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 21
    Points
    21
    Par défaut Quel est le message d'erreur ?
    Tu nous as fourni ton code. Mais le texte du message d'erreur est nécessaire aussi.

    La requête exécutée par la base de données n'est peut-être pas correcte !?!
    Quelles sont les définitions des champs ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    Bonjour MicBru

    C'est gentil de se pencher sur mon problème car je n'ai pas réussi à régler le problème.
    Le message d'erreur est dans le titre : L'opération doit utiliser une requête qui peut être mise à jour

    Je précise que la requête interroge une base Access.
    Je sais que ce n'est pas l'idéal et qu'il faudrait mieux utiliser SqlServeur mais je n'ai pas le choix car il s'agit d'un base produite par un tiers que je dois mettre à jour.

    Je peux fournir plus de code si nécessaire.

    Merci pour ton aide

    Bernard

  7. #7
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 652
    Points : 34 355
    Points
    34 355
    Par défaut
    Salut,

    ton champ IDLR est il indexé ?

    Si cette piste ne donne rien, il te reste la possibilite de passer par une requete et un recordset + Edit + Update

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    Bonjour

    oui le champs IDLR est indexé.

    La requête je l'ai déjà !
    Peux tu être plus explicite ?

    Merci

    Bernard

  9. #9
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    as-tu les droits en lecture et écriture sur ton fichier Access?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    Bonjour

    Oui j'ai les droits de lecture et écriture.
    A noter que cette erreur ne se produit que sur un nombre très faible des enregistrements et de façon aléatoire.

    Bernard

  11. #11
    Membre actif
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Points : 297
    Points
    297
    Par défaut
    Bonjour,

    Je préviens tout de suite que je n'ai pas fait de test et que je ne travail pas avec Access ou OleDb donc ça reste de la théorie, mais j'ai un peu de mal avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var dBcon = new OleDbConnection(Legacy.ConString);
    var cmd = new OleDbCommand(query, dBcon);
    using (dBcon)
    {
      //...
    }
    Je verrais plus quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    using(var dBcon = new OleDbConnection(Legacy.ConString))
    {
      using(var cmd = new OleDbCommand(query, dBcon))
      {
        //...
      }
    }
    Je me dis que ta commande n'est jamais disposée (ou mal), ce qui pourrait expliquer ton message d'erreur.
    De plus ta variable dBcon étant instanciée avant le using, elle reste accessible après, ce qui est source d'erreur (à mon avis ça explose).

    Enfin, à tester, je ferais moi-même des tests sur ce genre de chose quand j'aurais un peu de temps pour voir le comportement.

    Bonne continuation.

  12. #12
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 746
    Points : 5 444
    Points
    5 444
    Par défaut
    Je voudrais revenir sur la question de Jean-Philippe André car c'est celle qui me parait le plus pertinente.
    Ton index est-il bien unique ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 21
    Points
    21
    Par défaut Index pour la table.
    Que le champ ait un index (ou index unique) ou pas, n'a pas d'importance. L'index n'influence que sur la vitesse pour localiser les enregistrements concernés.

    Je te conseille de mettre un point d'arrêt sur ton instruction "var query = ..." et ainsi de récupérer le contenu (string) de query qui devrait être "UPDATE tblLR SET Location = '.....". Puis d'exécuter cette requête directement dans Access.
    De cette façon, nous saurons si la requête est valide.

  14. #14
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 652
    Points : 34 355
    Points
    34 355
    Par défaut
    Salut,

    je te mets un paquet de bonbons sur le fait que le message sera identique

  15. #15
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 746
    Points : 5 444
    Points
    5 444
    Par défaut
    Citation Envoyé par MicBru Voir le message
    Que le champ ait un index (ou index unique) ou pas, n'a pas d'importance. L'index n'influence que sur la vitesse pour localiser les enregistrements concernés.

    Je te conseille de mettre un point d'arrêt sur ton instruction "var query = ..." et ainsi de récupérer le contenu (string) de query qui devrait être "UPDATE tblLR SET Location = '.....". Puis d'exécuter cette requête directement dans Access.
    De cette façon, nous saurons si la requête est valide.
    Il s'agirait d'une base autre que Access, ça n'aurait pas d'importance.
    Sauf qu'en l’occurrence, ce phénomène est connu et la solution consiste à placer un index unique comme précisé dans ce post :
    https://support.microsoft.com/fr-fr/help/463266

    Il y a toutefois d'autres pistes :
    https://support.microsoft.com/fr-fr/...le-query-error

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 21
    Points
    21
    Par défaut Index avec valeur unique.

    Merci popo pour cette info.
    C'est donc inhérent au Jet d'Access.

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/12/2016, 00h22
  2. Réponses: 0
    Dernier message: 17/01/2010, 17h42
  3. Réponses: 1
    Dernier message: 18/12/2009, 10h29
  4. Réponses: 1
    Dernier message: 23/05/2008, 11h45
  5. Réponses: 7
    Dernier message: 29/04/2008, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo