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

  1. #1
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    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
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

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

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

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

  3. #3
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    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
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Points : 94
    Points
    94
    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 émérite
    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
    Points : 2 498
    Points
    2 498
    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 ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  6. #6
    Membre actif
    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 : 43
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Points : 214
    Points
    214
    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..

  7. #7
    Membre actif
    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 : 43
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Points : 214
    Points
    214
    Par défaut
    ta solution (faire un Fill après toute modif à une source de données) est celle qui est la meilleure à mon gout dans le cas de client déconnecté. Notamment dans le cas des rows qui sont 'Added' car l'AutoIncrement permet d'obtenir une primaryKey quis sera établi pour le SGBD..(pense qu'il y a plusieurs clients qui travaillent sur les mêmes bases)..de plus il est normal de 'rafraichier les Keys' dans un dataset afin de se servir en local des valeurs établies par le SGBD...il te faut donc un rafraichissement du contexte du DataSet quand tu agis sur la BD...surtout dans le cas des 'Added' ou 'Modified' (et encore plus en cascade)

  8. #8
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    L'ordre est bien logique, je suis d'accord avec toi

    Mais il n'a rien a voir avec le problème que j'ai énoncé
    Et l'usage de datatable a mon avis non plus d'ailleurs

    Le probleme est lié a l'usage d'une primary key auto increment
    Cela signifie que c'es le db engine qui va generer une clef connue par personne juste avant la creation

    Or cette nouvelle clef n'est pas mise a jour automatiquement dans la datatable

    Donc faute de mieux, je fais un clear et un fill pour l'attraper. Mais j'espèrais mieux...
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  9. #9
    Membre actif
    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 : 43
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Points : 214
    Points
    214
    Par défaut
    Oui en effet l'ordre importe peu car selon ton énoncé ce sont deux transactions qui s'éxecutent tour à tous, excuse moi cela portait à confusion j'ai mal lu..
    Cela permet de résoudre ton problème et réfléchis bien sur cet ordre et il te parait logique..
    Cette phrase est donc fausse...

    Cependant CA
    de plus il est normal de 'rafraichier les Keys' dans un dataset afin de se servir en local des valeurs établies par le SGBD...il te faut donc un rafraichissement du contexte du DataSet quand tu agis sur la BD...surtout dans le cas des 'Added' ou 'Modified' (et encore plus en cascade)
    ca résoud ton problème...car la méthode Add va ajouter les lignes dans la BD dont la statutrow est 'Added' mais elle ne considère pas la primary Key générée en local par le client (dans une datatable ou un dataset) CAR c'est le role du SGBD...OR la seule possibilité d'obtenir ces nouvelles PK est un Resultset ...il faut donc une requete SQL SELECT...et donc faire un Fill..c'est d'ailleurs intelligent (en mode déconnecté) de profiter d'une connexion pour rafraichir les données..

    c'est d'ailleurs une solution que Microsoft à utiliser dans le cas de génération de code des TableAdapters..Tu y as jeté un oeil à ces TablesAdapters juste pour te faire une idée ?

    Et l'usage de datatable a mon avis non plus d'ailleurs
    c'était pour t'expliquer ce qu'est un TableAdapters, je n'ai pas dis que les datatables résoudrait ton problème
    Je pensais que mon aide t'aurait éclaircit...mais ca ne se resent pas dans ta réponse..

  10. #10
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut Merci pour ta précision
    Tu est tres clair

    C'est vrai, tableadapter je sens pas encore ce que ca apporte

    Mais entre

    DataTable
    DataView
    DataAdapter
    TableAdapter
    Linq

    Il y a de quoi se perdre...
    Ca fait 6 semaines que j'ai démaré en C# en venant du C

    C'est tres agréable mais j'en ai encore partout sur les mains !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  11. #11
    Membre actif
    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 : 43
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Points : 214
    Points
    214
    Par défaut
    Yes pas de problème !

    6 semaines ! Dans ce cas jette un oeil dans le designer du dataset dans visual studio, il est bourré d'info...(créer un Mondataset.xsd puis aller dans le Mondataset.designer.cs) attention ne change au code généré...préfére surcharger les fonctions à modifier dans le fichier Mondataset.cs...

    Au plaisir de t'avoir aider alors..

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