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 :

[Linq to Sql] DuplicateKeyException


Sujet :

Accès aux données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    jcd
    jcd est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut [Linq to Sql] DuplicateKeyException
    Bonjour,

    Mon DataContext est unique (singleton).

    Dans mon projet d'application Web, j'ai une page Web d'inscription. Un Collaborateur est identifié dans le SQL Server par son matricule, un integer à 6 digits : Primary Key, int, Not Null, pas d'Identity (forcément).

    Quand l'utilisateur valide la page, la classe controleur est appelée avec en paramètre les valeurs des controles de la page Web.

    Une méthode de clase a la charge de vérifier que ce matricule n'existe pas déjàdans la Base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dc = CtrlMain.dc
    Dim monCollaborateur = (From c In dc.Collaborateur _
    						Where c.matricule = leMatricule _
                            Select c).SingleOrDefault()
    return monCollaborateur
    Si la mtéthode retourne Nothing, je crée un nouveau collaborateur, met à jour ses propriétés, Ok.

    Je vérifié avec SQL Server Management Studio dans la Base, avec un "SELECT ... WHERE ID =..." : 0 records founds, Ok.

    Le dc.InsertOnSubmit() fonctionne corerectement.

    Mais, presque systématiquement 1 fois sur 2 tests, la méthode d'insertion dc.SubmitChanges() retoune une System.Data.Linq.DuplicateKeyException

    Si l'enregistrement n'est pas dans la Base (0 records found), il pourrait se trouver en mémoire... mais je ne l'ai pas créé... ???!!

    Une idée ?

    D'avance merci,
    JC

  2. #2
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Par défaut
    Salut jcd,
    comme tu n'as pas trop mis de code qui (me) permettrait d'être plus précis; voici un exemple d'utilisation de linq pour update et insert:
    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
    Public Function maTableUpdateOrInsert(ByVal DC As LinqClassDataContext, ByVal C As LmaTable) As Integer
          Try
             Dim Retour As LmaTable = (From Ligne In DC.LmaTables Where (Ligne.Id = C.Id) Select Ligne).FirstOrDefault
             If Retour Is Nothing Then
                Retour = New LmaTable
                DC.LmaTables.InsertOnSubmit(Retour)
             End If
             With Retour
                .Libel = C.Libel
                .Id = C.Id
                .Valid = C.Valid
             End With
             DC.SubmitChanges()
             Return Retour.Id
          Catch ex As Exception
             TraiteErreur("maTableUpdateOrInsert", ex.ToString)
             Return 0
          End Try
       End Function
    voila j'espère que cela pourra t'aider, bon dev'

  3. #3
    jcd
    jcd est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    Merci pour ta réponse,
    Mis à part le fait que je faisais mon InsertOnSubmit après avoir défini les propriétés de mon objet, le reste est identique.

    A) Je fais une inscription, enregistrement des données dans la Base --> Ok
    B) Je supprimer les données dans la base (SQL Server Management Studio)
    C) Je refais une inscription avec un test de vérification que l'enregistrement n'existe pas dans la base avant de faire un éventuel New ==> Nothing, donc je fais un New, je définis les propriétés, je fais l'InsertOnSubmit, je fais le SubmitChanges ==> Exception

    JC

  4. #4
    jcd
    jcd est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    Code de Test qui génère l'exception lors de la 2ème insertion, qui indique bien qu'il reste quelque part en mémoire une instance de l'objet.

    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
    37
    38
    39
    40
    41
            'CREATE TABLE Test(
            '	id int NOT NULL PRIMARY KEY,
            '	libelle nchar(10) NOT NULL)
     
    Private Sub CmdButtonTest_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CmdButtonTest.Click
            Dim dc As CovoiturageDataContext = Nothing
     
            Try
                'Singleton DataContext
                ctrlM = CtrlMain.GetInstance()
                dc = ctrlM.dc
                Dim TheTest = (From t In dc.Test Select t Where t.id = 1).FirstOrDefault
                If TheTest Is Nothing Then
                    System.Diagnostics.Debug.WriteLine("No records in the Database's Test table with id=1")
                    TheTest = New Test
                    TheTest.id = 1
                    TheTest.libelle = "aaa"
                    dc.Test.InsertOnSubmit(TheTest)
                    dc.SubmitChanges()
                Else
                    System.Diagnostics.Debug.WriteLine("One record in the Database's Test table with id=1")
                End If
     
                'BreakPoint here and 'DELETE FROM Test WHERE id=1' in SQL Server Management Studio            
     
                TheTest = (From t In dc.Test Select t Where t.id = 1).FirstOrDefault
                If TheTest Is Nothing Then
                    System.Diagnostics.Debug.WriteLine("No records in the Database's Test table with id=1")
                    TheTest = New Test
                    TheTest.id = 1
                    TheTest.libelle = "aaa"
                    dc.Test.InsertOnSubmit(TheTest)
                    dc.SubmitChanges()
                Else
                    System.Diagnostics.Debug.WriteLine("One record in the Database's Test table with id=1")
                End If
     
            Catch ex As Exception
                System.Diagnostics.Debug.WriteLine("Error : " & ex.ToString)
            End Try
        End Sub

  5. #5
    jcd
    jcd est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    Bonjour,

    Donc je n'arrivais pas à réellement supprimer un objet du cache.

    Je n'ai pas trouvé de manière de contourner le pb sur le net.

    ==> J'ai donc supprimé tous mes appels de méthodes InsertOnSubmit, DeleteOnSubmit.... SubmitChanges.

    Puis, j'ai créé une mtéhode Insere et une MiseAjour avec les bonnes vieilles méthodes de l'ADO.NET en mode connecté, et effectué un Refresh sur l'objet LinqTo SQL dans le cache (MAJ du cache avec les valeurs de la Base de Données).
    JC

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/02/2008, 14h14
  2. [Linq to Sql] Insertion de quelques champs uniquement
    Par binoo dans le forum Accès aux données
    Réponses: 5
    Dernier message: 16/02/2008, 14h29
  3. [Linq 2 SQL] Problème de modélisation
    Par tomlev dans le forum Accès aux données
    Réponses: 5
    Dernier message: 12/02/2008, 23h29
  4. [Linq to sql] db.add() ?
    Par telynette dans le forum Accès aux données
    Réponses: 2
    Dernier message: 08/02/2008, 19h54
  5. [Linq to SQL] Refresh du dbml
    Par zeavan dans le forum Visual Studio
    Réponses: 5
    Dernier message: 02/01/2008, 10h15

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