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

ADO.NET Discussion :

Violation de l'accès concurrentiel


Sujet :

ADO.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Points : 69
    Points
    69
    Par défaut Violation de l'accès concurrentiel
    Bonjour,

    Je cherche depuis quelques temps à corriger le porblème de "violation de l'acccès concurrentiel" qui se produit lorsque je fais un Update de TableAdaptater. Actuel je n'ai trouvé aucune solution concréte.

    La solution de fusionner via la procédure "Merge" ne fonctionne pas correctement. Elle m'ajoute des lignes en doublons ?

    Si vous avez des idées, n'hésitez pas à me les partager.

  2. #2
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Explique davantage les conditions dans lesquelles se produit le problème.

    Si cela se produit lorsqu'une modification est effectuée sur un enregistrement qui vient d'être ajouté dans un Update précédent et que tu utilises un champ auto-incrément, c'est que la valeur du champ autoincrément n'a pas été récupérée suite à l'ajout.

    La récupération du champ autoincrément se paramètre dans l'UpdateCommand du DataAdapter et la syntaxe SQL varie suivant le SGBD utilisé.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Points : 69
    Points
    69
    Par défaut
    j'utilise une base de données Access. Quant aux erreurs de violation d'accés concurrentiel ils apparaissent de façon aléatoire aussi bien à l'ajout qu'à la modification.

    Exemple :

    J'ajoute 30 articles dans le programme (dataset) je fais l'enregistrement (update) et là j'obtiens l'erreur d'accés concurrentiel. Mais je peux refaire la même chose le lendemain et celà marchera par contre très bien, c'est aléatoire. Idem pour des modifications.



    PS : Sais-tu comment rendre un champs UNIQUE et à la fois autorisé les valeurs null dans ce champs. C'est-à-dire que quand la personne connait la valeur il enregistre tout en vérifiant quel sois Unique mais si il ne la connais pas il laisse vide. Actuellement il ne me prends pas les valeurs Null sous prétexte qu'il y a dèjà une valeur Null dans la base et donc ça va en contraite avec la propriété Unique.


    Merci pour tes conseils.

  4. #4
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Sais-tu comment rendre un champs UNIQUE et à la fois autorisé les valeurs null dans ce champs.
    Propriété IgnoreNulls de l'Index à true.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Quant aux erreurs de violation d'accés concurrentiel ils apparaissent de façon aléatoire aussi bien à l'ajout qu'à la modification
    • Est-ce que cela se produit en cas d'ajouts seuls (sans modifications) ?
    • Dans ce cas, est-ce que le message n'est pas normal, c'est à dire que tu fais des ajouts d'enregistrements dont la clé primaire existe dèjà ?
    • Utilises-tu des clés AutoIncrement ?
    • Peux-tu indiquer la valeur du DataAdapter.UpdateCommand.Text ?
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Points : 69
    Points
    69
    Par défaut
    * Est-ce que cela se produit en cas d'ajouts seuls (sans modifications) ?
    * Dans ce cas, est-ce que le message n'est pas normal, c'est à dire que tu fais des ajouts d'enregistrements dont la clé primaire existe dèjà ?
    * Utilises-tu des clés AutoIncrement ?
    * Peux-tu indiquer la valeur du DataAdapter.UpdateCommand.Text ?
    - L'erreur concurrentiel se produit dans chacun des 3 cas : Ajout, modification et suppression mais de façon aléatoire. (Des fois tout fonctionne bien)
    - Oui j'utilise Une Clef AutoIncrement (+1 à chaque fois)
    - Et voici la valeur de mon DataAdapter.UpdateCommand.Text :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Me._adapter.UpdateCommand.CommandText = "UPDATE `Outillage` SET `Designation` = ?, `Reference` = ?, `Quantite` = ?, `Range"& _ 
                    "ment` = ?, `Marque` = ?, `Observation` = ?, `Image` = ?, `DateInventaire` = ? WH"& _ 
                    "ERE ((`Id` = ?) AND ((? = 1 AND `Designation` IS NULL) OR (`Designation` = ?)) A"& _ 
                    "ND ((? = 1 AND `Reference` IS NULL) OR (`Reference` = ?)) AND ((? = 1 AND `Quant"& _ 
                    "ite` IS NULL) OR (`Quantite` = ?)) AND ((? = 1 AND `Rangement` IS NULL) OR (`Ran"& _ 
                    "gement` = ?)) AND ((? = 1 AND `Marque` IS NULL) OR (`Marque` = ?)) AND ((? = 1 A"& _ 
                    "ND `Observation` IS NULL) OR (`Observation` = ?)) AND ((? = 1 AND `Image` IS NUL"& _ 
                    "L) OR (`Image` = ?)) AND ((? = 1 AND `DateInventaire` IS NULL) OR (`DateInventai"& _ 
                    "re` = ?)))"

    Pour ce qui est de rendre Unique un champ tout en autorisant les valeur NULL. Je n'ai pas trouvé comment attribué la propriété IGNORENULLS à l'index. Réellement je ne sais pas comment faire pour atteindre L'index qui se nomme dans ma base de Donnée Access comme le nom de sa colonne soit "Reference".

  7. #7
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Pour ce qui est de rendre Unique un champ tout en autorisant les valeur NULL. Je n'ai pas trouvé comment attribué la propriété IGNORENULLS à l'index.
    Sous MS-ACCESS, en mode création de la table :
    menu/affichage/index : case à cocher "Ignorer nulls".

    Dans l'InsertCommand, on doit récupérer la valeur du champ autoincrément. Pour ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MyOleDbDataAdapter.InsertCommand.Text+=" ; SELECT `"+
       MyAutoIncrementColumnName+"` FROM `"+MyTableName+
       "` WHERE `"+AutoIncrementColumnName+"` = LAST_INSERT_ID();" ;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Points : 69
    Points
    69
    Par défaut
    Où dois-je mettre ce code ? Dois-je l'adapter pour les autres (Update, Delete) ?

    De plus étant donnée que je programme en Visual Basic .net pourrai-je avec le code en Visual Basic.

    Merci.

    Pour ce qui est du IgnoreNulls, j'ai trouvé mais je n'ai pas de différence par rapport à avant. j'ai toujours l'erreur du Doublons.

  9. #9
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Où dois-je mettre ce code ?
    Après la construction et l'initialisations du DataAdpater, si elle est faite par code.
    Si c'est fait danss le designer, une seule fois avant la commande Update.

    Dois-je l'adapter pour les autres (Update, Delete) ?
    Non

    je programme en Visual Basic .net
    A+ = "b" en C# donne A = A & "b" en basic
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Points : 69
    Points
    69
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyOleDbDataAdapter.InsertCommand.Text+=" ; SELECT `"+
       MyAutoIncrementColumnName+"` FROM `"+MyTableName+
       "` WHERE `"+AutoIncrementColumnName+"` = LAST_INSERT_ID();" ;

    Comme tu as pu le constater je ne suis pas un expert en VB mais si je comprends bien en tapant cette ligne dans mon code avant l'update je modifie donc la propriété Text de l'insert command du DataApter autrement dit celui générer dans le designer donc comment il peut insérer la Nouvelle Ligne alors que je lui déclare un "Select".

    De plus quand tu écris : A+ = "b" en C# donne A = A & "b" en basic je ne comprends rien, celà serai plus simple que tu me l'écrives directement en VB et ainsi je ferai moi même la comparaison.

    De plus je tiens aussi à te remercier pour ton aide car là j'avoue je bloque dur.

  11. #11
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Comment il peut insérer la Nouvelle Ligne alors que je lui déclare un "Select".
    A partir de la command Select, le designer (que perso je n'utilise pas pour l'accès aux tables) doit générer les commandes insert, update et delete probablement à traversle CommandBuilder.
    tu me l'écrives directement en VB
    Ne pratiquant pas VB, je ne voudrais pas écrire des bétises.
    Mais le principe est de concaténer à l'UpdateCommand.Text une commande SELECT SQL pour récupérer l'Id.
    Par exemple, concaténer:
    " ; SELECT Id from Outillage WHERE Id=LAST_INSERT_ID(); "

    J'ai enlevé les simples quotes facultatives dans ce cas.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Points : 69
    Points
    69
    Par défaut
    le designer (que perso je n'utilise pas pour l'accès aux tables)
    Dans Visual Studio, le Designer est créé automatiquement dès lors que j'importe une base de donnée. De plus comment créer un DataSet Typé manuellement. Quand je vois le code du Designer il m'aurai été impossible de tapé (savoir) tout celà ?


    De plus concernant le IgnoreNulls je l'ai bien activé au niveau de ma base Access mais ne dois-je pas l'activer dans mon DataSet et si oui de quel façon. Actuellement et malgré le paramétrage de IgnoreNulls à True, dans le fichier Access, j'ai toujours une alarme "doublons" qui est déclenché au niveau du DataSet.

  13. #13
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Si yu utilises le designer, il suffit de modifier les init effectués par le designer, avant d'utiliser le dataAdapter dans le code de ton appli.

    Pour le IgnoreNulls, le designer a du crééer quelquechose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyDataSEt.Tables("MyTable").Columns("MyUniqueKeyId").Unique = True
    Il faudrait "ajouter" avant l'utilisation des DataAdapter:[/FONT]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyDataSet.Tables("MyTable").Columns("MyUniqueKeyId").AllowDBNull = True
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Points : 69
    Points
    69
    Par défaut
    Excuse moi mais quand tu dis "il suffit de modifier les init effectués par le designer" je ne comprends pas du tout ce que je dois faire.

    Ci-joint le Fichier en question si cela peut aider.
    Fichiers attachés Fichiers attachés

  15. #15
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Ne modifie le code généré par le designer, mais celui de ta form.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Points : 69
    Points
    69
    Par défaut
    J'ai longuement étudier tout les messages que tu m'as écris et malgré cela je n'ai pas compris où je dois intégrer la ligne que tu m'a donnée.
    Lorsque j'écris cette ligne il me dit que la propriété InsertCommand n'est pas un attribut de OutillageTableAdapter donc je ne comprends ce que je dois faire.

    De plus concernant le IgnoreNull le DataSet ne le prends pas correctement : lorsque je fais une fusion (via Merge) celui-ci m'indique des erreurs de champs uniques sur des champs Vide or cela ne devrait pas être le cas (il devrait les accepté).

    Je te remercie de ton aide.

  17. #17
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Le doute m'habite :-)
    Avez vous un IDENTITY (autoIncrément en base) sur votre table?
    Ou le gérez vous salement c'est à dire manuellement?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  18. #18
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Le doute m'habite :-)
    Avez vous un IDENTITY (autoIncrément en base) sur votre table?
    Ou le gérez vous salement c'est à dire manuellement?
    On peut très bien envisager des scénarios propres ou il n'y a pas utilisation d'IDENTITY
    Exemple: Dans des scénarios à faible connectivité (type embarqué) on utilise un GUID pour l'identifiant. Ce qui limite les conflits lors du merge.

  19. #19
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Vous déformez mes propos :-)

    Je n'ai pas dis que ne pas utiliser IDENTITY était sale, je dis que gérer manuellement (par code client) un auto incrément est sale...

    L'utilisation du GUID est bien souvent une absurdité en tant que primary key...

    C'est on ne peux plus contre-performance...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  20. #20
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Vous déformez mes propos :-)

    Je n'ai pas dis que ne pas utiliser IDENTITY était sale, je dis que gérer manuellement (par code client) un auto incrément est sale...

    L'utilisation du GUID est bien souvent une absurdité en tant que primary key...

    C'est on ne peux plus contre-performance...
    +1. Mais faut faire gaffe avec IDENTITY, utiliser SCOPE_IDENTITY à la place.

Discussions similaires

  1. oleDB - Violation de l'accès concurrentiel
    Par JbTech dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/05/2010, 17h05
  2. Réponses: 0
    Dernier message: 20/05/2010, 10h46
  3. ErrorMessage : Violation de l'accès concurrentiel
    Par mohamed301084 dans le forum VB.NET
    Réponses: 2
    Dernier message: 28/04/2010, 10h46
  4. Problème de "Violation de l'accès concurrentiel"
    Par Marc_27 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/06/2009, 16h24
  5. Violation de l'acces concurrentiel
    Par bilou972 dans le forum C#
    Réponses: 3
    Dernier message: 20/04/2009, 16h24

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