none
OptimisticConcurrencyException Erreur RRS feed

  • Question

  • Bonjour,

    J'ai une application qui démarre des Run et rempli une base de données (SQl Server 2008 Express R2) sur un serveur .

    J'ai une table avec a l'intérieur une ligne par application (avec un champ ID pour chaque application).

    Et un autre champs pour l'état de l'application ( 0 = off , 1 = on).

    Lorsque que je lance les application sur des PC Distants (client) j'ai cette erreur qui apparait lorsque qu'un client change son état :

    OptimisticConcurrencyException : Une instruction de mise a jour, d'insertion ou de suppression dans le magasin a affecté un nombre inattendu de ligne(0).Des entités ont peut-être été modifier depuis leur chargement. Actualisez les entrées ObjectStateManager.

    J'ai fait pas mal de recherche sans résultats...

    Aidez moi je suis totalement perdu !

     

    merci

    Kevdeta

    mercredi 18 janvier 2012 09:04

Réponses

Toutes les réponses

  • Bonjour,

    Le verrouillage optimiste a pour but de s'assurer au moment de la mise à jour que les données n'ont pas été modifiées entretemps par qq d'autre :
    - soit en testant les valeurs originales des colonnes
    - soit en utilisant une colonne "version" qui est modifiée automatiquement par SQL Server à chaque UPDATE

    Donc ici, il semblerait que l'on ait qq chose comme :
    - le client charge une ligne
    - on modifie une valeur sur cette ligne depuis une autre application
    - le client tente de modifier cette ligne mais la clause WHERE teste aussi les valeurs originales. Comme elles ont été modifiées on ne trouve plus la ligne.

    Cela concerne plutôt la programmation côté client, voir plutôt je pense un groupe .NET.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mercredi 18 janvier 2012 09:32
  • Je sais que le pb vient du client car coté serveur il n'y a rien, juste sql server R2.

    Voila le bout de code ou l'erreur apparait :

     

     public static bool UpdateStatusMachine(byte status)
            {
                // Connexion string
                string connectionString = "server=" + ConfigurationManager.AppSettings["SQLServerName"] + ";database=MaBDD;Trusted_Connection=True";
    
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    try
                    {
                        string MYQuery = "UPDATE Table_1 SET Status = "+ status +" WHERE MachineID ='" + Global.MachineID.ToString() + "'";
    
                        connection.Open();
    
                        SqlCommand command = new SqlCommand(MYQuery, connection);
    
                        command.ExecuteNonQuery();
    
                        return true;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                        Global.ShowMsg("Error UpdateAutomateTable : " + ex.ToString());
                        return false;
                    }
                }
            }
    

    Et donc on insère un status quelconque selon la machine (selon l'application enfaite).

    Mais je ne voit pas comment résoudre ce problème .

    mercredi 18 janvier 2012 10:29
  • Je sais que le pb vient du client car coté serveur il n'y a rien, juste sql server R2.

    Ok, j'expliquais car le groupe choisi concerne donc plutôt le serveur (procédures stockées, jobs SQL etc..., SSIS etc...) et ne me paraissait donc pas très approprié. Comme je disais un groupe .NET semblerait plus adapté.

    Vous êtes sûr que c'est bien dans ce code ? Ce code envoie une commande et n'utilise donc pas le verrouillage optimiste. De plus la mention de StateObjectManager dans le message me laisserait plutôt que l'erreur survient dans le cadre d'une mise à jour s'appuyant sur Entity Framework ? On n'utilise pas Entity Framework dans l'appli concernée ?

    Donc voir plutôt http://social.msdn.microsoft.com/Forums/fr-fr/categories et un groupe comme Visual C# ou Linq et Entity Framework selon le cas...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mercredi 18 janvier 2012 12:12
  • Oui vous avez totalement raison, le code que je vous est fourni est "ma 2ème solution" que j'ai voulu tester à la place de Entity Framework mais avec sa j'obtien la même erreur ...

    Bref revenons a Entity Framework et l'erreur initial :

    J'ai testé ceci pour (selon des sources msdn) rafraichir l'object context :

     try
    {
       SaveChanges();
     }
     catch (OptimisticConcurrencyException) 
     {
             try
             {
                 // Resolve the concurrency conflict by refreshing the 
                 // object context before re-saving changes. 
                 context.Refresh(System.Data.Objects.RefreshMode.ClientWins, _dbMaTable.Status);
    
                // Save changes.
                SaveChanges();
            }
            catch (Exception ex)
            {
                Global.ShowMsg("ERROR Refresh : " +ex.ToString());
            }
    }
    

     

    Mais bon je suis un débutant et je ne suis pas sur de ma méthode refresh l'attribut "_dbMaTable.Status", je ne sais pas si je doit rafraichir ceci ou autre chose.

    J'ai encore une exception " OptimisticConcurrencyException " sur le 2ème catch ici.

    Merci


    • Modifié KevDeta mercredi 18 janvier 2012 12:35
    mercredi 18 janvier 2012 12:34
    • Marqué comme réponse KevDeta jeudi 19 janvier 2012 07:07
    jeudi 19 janvier 2012 07:06