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 :

Problème avec méthode UpdateCommand


Sujet :

C#

  1. #1
    Membre éclairé Avatar de Nixar
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 302
    Par défaut Problème avec méthode UpdateCommand
    BOnjour à tous,

    J'ai posté 2 questions la semaine dernière sur l'utilisation des DataAdapters et DataSets car j'avais systématiquement une erreur de violation d'accès concurrentiel. Un post de Benzeghiba m'a beaucoup aide en me disant ceci :

    En général cette erreur
    Code :

    Violation de l'accès concurrentiel : DeleteCommand a affecté 0 des enregistrements 1 attendus."
    se produit lorsque tu supprime une ligne (DataRow) de ton DataSet puis tu exécutes la suppression réelle (dataadapter.update) mais ccette opération ne trouve pas dans la DB les lignes qui ont été supprimées du DataSet, par ne les trouve pas je veux dire la clause where de ta requete delete ne correspond à aucune ligne !
    Je pense que je n'ai foncièrement pas compris comment marche un DataSet. j'ai épluché tous les tuto que j'ai pu trouver, mais aucun ne traite un cas complet de connexion à une base sql avec les objets sqlconnection avec une mise à jour, suppression ou ajout d'une ligne dans un dataset puis dans une table comme je .

    Voici un cas simple que j'essaie de réaliser : un dataset (rempli à partir d'une table "TableNewsletter" via la méthode fill, ca ca fonctionne) contient des informations liées à un user, notamment, son mail. Je veux updater toutes les lignes de ce dataset en changeant le mail par un nouveau. Voici mon code ca plante (Violation d'accès concurrentiel lors du DataAdapter.Update) et je ne comprend pas pourquoi. Quelqu'un pourrait-il commenter mon code en me disant où est le souci? Merci beaucoup d'avance....

    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
     
            // Méthode de connexion à la base sqlserver 2005
            SqlConnection Connexion = ConnexionBase();
            SqlDataAdapter SqlDataAdapter1;
            SqlDataAdapter1 = new SqlDataAdapter();
     
            // Remplissage de la commande UpdateCommand. La condition update   toutes les lignes qui contiennent l'ancien mail
            SqlDataAdapter1.UpdateCommand = new SqlCommand(
               "UPDATE " + TableNewsletter + " SET " + ChampEmailNewsletterBase + "= @" + ChampEmailNewsletterBase +
            " WHERE " + ChampEmailNewsletterBase + "='" + OldEmail +"'",Connexion);
     
            //Création du paramètre qui contient le nouvel email
            SqlParameter ParamMail = new SqlParameter("@" + ChampEmailNewsletterBase, SqlDbType.VarChar, 50, ChampEmailNewsletterBase);
            ParamMail.Value = NewEmail;
     
            // Ajout du paramètre à la commande
            SqlDataAdapter1.UpdateCommand.Parameters.Add(ParamMail);
     
            try
            {
                //Modification dans le dataset
                foreach (DataRow Row in DataSetOrigine.Tables[TableNewsletter].Rows)
                {
                    Row[ChampEmailNewsletterBase] = NewEmail;
                }
                //Mise à jour
                SqlDataAdapter1.Update(DataSetOrigine, TableNewsletter);
            }
            catch (Exception exc)
            {
                throw new Exception(exc.Message);
            }
            Connexion.Close();
            Connexion.Dispose();
            // Commit des modifs car dataset utilisé après
            DataSetOrigine.AcceptChanges();

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Le problème vient du fait que tu as mixé 2 solutions:
    1) l'utilisation de "SqlDataAdapter1.Update(DataSetOrigine, TableNewsletter)
    2) la modification pour chaque row via l'updatecommand.

    La solution 1) est possible, mais avec une updatecommand paramétrée avec 2 new SqlParameter, l'un référant à la nouvelle valeur et l'autre à la valeur initiale.
    Ensuite, boucle pour modifier chaque row, suivie en fin de boucle d'une update commande unique gobale pour valider toutes les modifs.

    La solution 2) est aussi possible, mais il faut créer une commande sqlCommand (pas l'updatecommand de l'adapter), puis pour chaque ligne exécuter cette commande (ExecuteNonQuery), ce qui donnerait quelquechose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SqlCommand.Mycommand = new SqlCommand(
       "UPDATE " + TableNewsletter + 
       " SET " + ChampEmailNewsletterBase + "= @" + ChampEmailNewsletterBase +
       " WHERE " + ChampEmailNewsletterBase + "='" + OldEmail +"'",Connexion);
    // ... 
    // dans la boucle sur les rows :
    myCommand.ExecuteNonQuery

Discussions similaires

  1. problème avec méthode 'constructeur' sur tkinter()
    Par velight dans le forum Tkinter
    Réponses: 8
    Dernier message: 23/02/2009, 11h35
  2. [C#] Probléme avec Méthode Static
    Par WebTeamMtl dans le forum C#
    Réponses: 4
    Dernier message: 07/11/2008, 22h27
  3. Problème avec méthode unload
    Par label55 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/05/2008, 10h45
  4. Problème avec méthode AddFromString
    Par Farbin dans le forum VBA Access
    Réponses: 7
    Dernier message: 04/02/2008, 18h21
  5. Problème avec méthode "cloneNode()"
    Par kingmandrax dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 31/10/2006, 14h14

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