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

Accès aux données Discussion :

Concurrency violation ADO


Sujet :

Accès aux données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Concurrency violation ADO
    Bonjour,

    Je decouvre un problème avec ADO

    1- J'ai une table avec une primary key auto increment
    2- Je fais un query sur cette table je replis un dataset et j'affiche dans un DGV
    2- Je cree un nouveau record
    3- Je fais un update
    4- J'efface le record
    Concurrency violation: the DeleteCommand affected 0 of the expected 1 records."

    Le problème semble venir du fait que la nouvelle clef créee dans la db n'est pas mise a jour dans le dataset donc le delete juste apres cree le problème

    Comment puis-je forcer la mise a jour du DS

    Pour le moment, je fais un clear et un fill apres les ajouts

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Par défaut
    Salut,

    Il faudrait un exemple du code pour mieux comprendre l'origine du problème...

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    Je veux bien t'envoyer le code mais tout est expliqué dans la logique et l'origine du problème est identifiée. Maintenant ce que je cherche c'est la bonne maniere pour l'eviter

    1- J'ai une table avec une primary key auto increment
    2- Je fais un query sur cette table je remplis un dataset et j'affiche dans un DGV
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          string selectcmd = "SELECT * FROM `containers`";
          adaContUpd.SelectCommand = new MySqlCommand(selectcmd, MyConn.conn);
          adaContUpd.Fill(dsContUpd);
          dgv_ContUpd.DataSource = dsContUpd.Tables[0];
    2- Je cree un nouveau record
    a la main dans le dgv
    3- Je fais un update
    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
          MySqlCommandBuilder cb = new MySqlCommandBuilder(adaContUpd);
          DataSet ch = new DataSet();
          ch = dsContUpd.GetChanges(DataRowState.Added);
          if (ch != null)
          {
            try
            {
              int upd = adaContUpd.Update(ch);
            }
            catch (MySqlException e)
            {
              MessageBox.Show(e.Message);
              return;
            }
            dsContUpd.Clear();
            adaContUpd.Fill(dsContUpd);
          }
          dsContUpd.AcceptChanges();
    4- J'efface le record
    a la main dans le DGV
    5- Dans la DB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          MySqlCommandBuilder cb = new MySqlCommandBuilder(adaContUpd);
          DataSet ch = new DataSet();
          ch = dsContUpd.GetChanges(DataRowState.Deleted);
          if (null != ch)
          {
            int del = adaContUpd.Update(ch);
          }
    BOUM : parce que la primary key dans le DS est toujours vide, elle n'a pas eté adaptée par la commande add qui a automatiquement généré une nouvelle valeur autoincrement
    Ma question est donc COMMENT faire en sorte que le datasource soit mis a jour lors du add, j'ai contourné en faisant un clear et un nouveau fill mais ca ne me semble pas la methode la plus pertinente

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Par défaut
    Si tu veux mettre à jour la BD à chaque insertion et à chaque suppression d'un enregistrement, fais un update avec ton tableAdapter après chaque insert et après chaque update.

    Tu n'auras pas ce problème.

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Quel est cet animal ?
    TableAdapter ?

    Quel est cet animal, je ne connais pas encore
    J'utilise un DataAdapter, signalé a l'étape 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int upd = adaContUpd.Update(ch);
    Que suggere tu de faire apres ca ?

  6. #6
    Membre expérimenté
    Avatar de Ecosmose
    Homme Profil pro
    Archi SI / Soft / Réseau / SCADA /Automate
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Archi SI / Soft / Réseau / SCADA /Automate
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Par défaut
    Les TableAdapter sont un héritage des dataAdapter qui ajoute des fonctionnalitées supplémentaires...lorsque tu utilises les outils de Visual Studio 2005, les TA sont générés automatiquement lorsque tu crées les Datatables...

    Pour ton cas pratique je te conseillerais de définir ta méthode UPDATE du adapter pour procéder toujours dans cet ordre (qui est aussi préconisé pour les commandes SQL dans un transaction)

    1- DELETE
    2- INSERT
    3- UPDATE

    Cela permet de résoudre ton problème et réfléchis bien sur cet ordre et il te parait logique..

Discussions similaires

  1. [ADO] Violation d'accès en utilisant EditConnectionString
    Par Kephuro dans le forum Bases de données
    Réponses: 7
    Dernier message: 02/04/2008, 16h22
  2. [VB.NET 2003] Concurrency violation
    Par Kropernic dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/09/2007, 14h08
  3. [Visual C++] Problème ADO Access violation
    Par irnbru dans le forum MFC
    Réponses: 2
    Dernier message: 24/10/2005, 11h46
  4. Réponses: 2
    Dernier message: 06/02/2004, 17h09
  5. Db Express : un concurrent d'ADO ?
    Par Bruno75 dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/12/2003, 09h23

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