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 OleDB


Sujet :

ADO.NET

  1. #1
    Invité
    Invité(e)
    Par défaut Violation de l'accès concurrentiel OleDB
    Bonjour,

    Dans un formulaire gérant un listing clients grâce au DataBinding, j'ai le message d'erreur qui se trouve en pièce jointe lorsque j'appelle la mise à jour de ma base de données uniquement pour la commande "UpdateCommand" (select, insert et delete ne retournent pas d'erreur).

    Je suis étonné d'avoir levé cette exception étant donné que je travaille seul sur cette base qui n'est rien d'autre qu'un banal fichier Access 2013 ouvert en local par une seule application. Cette erreur signifie bien qu'il y a des erreurs dues à un accès multiple n'est-ce pas ?

    Voici le code de mes commandes insert et 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    daClients.InsertCommand = New OleDbCommand("insert into Clients (Sexe, Nom, Prenom, Adresse1, Adresse2, CodePostal, Ville, Pays, Telephone, eMail, Misc, ListingCourrier, Prospect) values (@Sexe, @Nom, @Prenom, @Adresse1, @Adresse2, @CodePostal, @Ville, @Pays, @Telephone, @eMail, @Misc, @ListingCourrier, @Prospect)", connection)
                    With daClients.InsertCommand.Parameters
                        .Add("@Sexe", OleDbType.Char, 20, "Sexe")
                        .Add("@Nom", OleDbType.Char, 50, "Nom")
                        .Add("@Prenom", OleDbType.Char, 50, "Prenom")
                        .Add("@Adresse1", OleDbType.Char, 255, "Adresse1")
                        .Add("@Adresse2", OleDbType.Char, 255, "Adresse2")
                        .Add("@CodePostal", OleDbType.Char, 8, "CodePostal")
                        .Add("@Ville", OleDbType.Char, 100, "Ville")
                        .Add("@Pays", OleDbType.Char, 50, "Pays")
                        .Add("@Telephone", OleDbType.Char, 12, "Telephone")
                        .Add("@eMail", OleDbType.Char, 255, "eMail")
                        .Add("@Misc", OleDbType.LongVarChar, 64000, "Misc")
                        .Add("@ListingCourrier", OleDbType.Boolean, 1, "ListingCourrier")
                        .Add("@Prospect", OleDbType.Boolean, 1, "Prospect")
                    End With
     
                    daClients.UpdateCommand = New OleDbCommand("UPDATE Clients SET Sexe=@Sexe, Nom=@Nom, Prenom=@Prenom, Adresse1=@Adresse1, Adresse2=@Adresse2, CodePostal=@CodePostal, Ville=@Ville, Pays=@Pays, Telephone=@Telephone, eMail=@eMail, Misc=@Misc, ListingCourrier=@ListingCourrier, Prospect=@Prospect WHERE N°=@N°", connection)
                    With daClients.UpdateCommand.Parameters
                        .Add("@N°", OleDbType.Integer, 5, "N°")
                        .Add("@Sexe", OleDbType.Char, 20, "Sexe")
                        .Add("@Nom", OleDbType.Char, 50, "Nom")
                        .Add("@Prenom", OleDbType.Char, 50, "Prenom")
                        .Add("@Adresse1", OleDbType.Char, 255, "Adresse1")
                        .Add("@Adresse2", OleDbType.Char, 255, "Adresse2")
                        .Add("@CodePostal", OleDbType.Char, 8, "CodePostal")
                        .Add("@Ville", OleDbType.Char, 100, "Ville")
                        .Add("@Pays", OleDbType.Char, 50, "Pays")
                        .Add("@Telephone", OleDbType.Char, 12, "Telephone")
                        .Add("@eMail", OleDbType.Char, 255, "eMail")
                        .Add("@Misc", OleDbType.LongVarChar, 64000, "Misc")
                        .Add("@ListingCourrier", OleDbType.Boolean, 1, "ListingCourrier")
                        .Add("@Prospect", OleDbType.Boolean, 1, "Prospect")
                    End With
    Tous les champs sont de type texte sauf les deux derniers correspondants à des checkboxes. Le champ N° est la clé primaire numéro auto de type entier.

    La routine qui effectue la mise à jour de la base de données :
    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
    Private Sub MettreAJourdb(sender As Object, e As EventArgs) Handles EnregistrerModificationsToolStripMenuItem.Click
            Try
                If MyDataSet.HasChanges Then
                    connection.Open()
                    daClients.Update(MyDataSet, "Clients")
                    MyDataSet.AcceptChanges()
                Else
                    MessageBox.Show("Il n'y a pas de modification à enregistrer", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                connection.Close()
            End Try
        End Sub
    Y voyez-vous une erreur ?

    Merci d'avance pour vos réponses !

    webrider
    Images attachées Images attachées  

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    En réalité l'UpdateCommande fonctionne à l'aide d'une requête ayant la forme suivante:

    Update monrowtoupdate
    set x = monrowtoupdate.nouvellevaleurx
    Where x = monrowtoupdate.valeurinitialdex

    Je me souviens plus de tête la syntaxe précise pour obtenir la valeur initial et la valeur courante d'une cellule dans un datarow. S'il reçoit en retour 0 enregistrement, une exception d'accès concurentiel est lancée (signifie que l'enregistrement sur la base de donnée a eu une modification depuis la création du datarow).

    Cette situation peut survenir si 2 utilisateurs travaille sur la base de donnée mais aussi si un même utilisateur modifie un même enregistrement par plusieurs moyen (2 dataset par exemples, ou un dataset et des requêtes sql à la main). Vous êtes probablement dans le deuxième cas.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Sinople merci pour votre réponse que j'ai lue avec attention.

    Si je considère ceci :

    Update monrowtoupdate
    set x = monrowtoupdate.nouvellevaleurx
    Where x = monrowtoupdate.valeurinitialdex
    Voulez-vous dire que le Dataset aurait perdu la valeur initiale du champ modifié ?

    Dans mon cas je suis seul à travailler sur une base de donées Access locale, et aucune autre modification n'intervient dans des sql à la main. Les seules requêtes sont celles du DataAdapter. Le fait de changer une valeur puis d'effectuer la mise à jour DB me lève cette exception.

    Je vais essayer d'afficher les valeurs initiales lors de l'update pour voir si la valeur initiale est correcte.

    Je reviens vous dire ce qu'il en retourne.

    webrider

  4. #4
    Invité
    Invité(e)
    Par défaut
    Le problème venait tout simplement de la construction de la requête SQL, je l'ai remplacée par celle-ci et depuis plus de problème :

    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
    daClients.UpdateCommand = New OleDbCommand("UPDATE Clients SET Sexe=?, Nom=?, Prenom=?, Adresse1=?, Adresse2=?, CodePostal=?, Ville=?, Pays=?, Telephone=?, eMail=?, Misc=?, ListingCourrier=?, Prospect=? WHERE N°=?", connection)
                    With daClients.UpdateCommand.Parameters
                        .Add("Sexe", OleDbType.Char, 20, "Sexe")
                        .Add("Nom", OleDbType.Char, 50, "Nom")
                        .Add("Prenom", OleDbType.Char, 50, "Prenom")
                        .Add("Adresse1", OleDbType.Char, 255, "Adresse1")
                        .Add("Adresse2", OleDbType.Char, 255, "Adresse2")
                        .Add("CodePostal", OleDbType.Char, 8, "CodePostal")
                        .Add("Ville", OleDbType.Char, 100, "Ville")
                        .Add("Pays", OleDbType.Char, 50, "Pays")
                        .Add("Telephone", OleDbType.Char, 12, "Telephone")
                        .Add("eMail", OleDbType.Char, 255, "eMail")
                        .Add("Misc", OleDbType.LongVarChar, 64000, "Misc")
                        .Add("ListingCourrier", OleDbType.Boolean, 1, "ListingCourrier")
                        .Add("Prospect", OleDbType.Boolean, 1, "Prospect")
                        .Add("N°", OleDbType.Integer, 5, "N°")
                    End With
    Je vais enfin pouvoir avancer !

+ Répondre à la discussion
Cette discussion est résolue.

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