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

ASP.NET Discussion :

ExecuteNonQuery() & Violation of PRIMARY


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 74
    Par défaut ExecuteNonQuery() & Violation of PRIMARY
    Bonjour,
    J'utilise un code c# pour importer des données du fichier texte vers ma base de donnée.

    le code fonctionne mais j'ai un problème lors la duplication d'un clé primaire.
    Je cherche comment ajouter un test,Si n'existe pas ajouter SInon n'ajouter pas.

    voici mon code et la ligne en rouge qui génère l'erreur.
    [SqlException (0x80131904): Violation of PRIMARY KEY constraint 'PK_airnode'. Cannot insert duplicate key in object 'dbo.airnode'
    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
    StringBuilder insertCmd = new StringBuilder();
    
            string line;
            string[] myData;
            string[] delimiter = { "," };
    
            // Read the file and display it line by line.
            System.IO.StreamReader file = new System.IO.StreamReader("c:\\air.stat");
            while ((line = file.ReadLine()) != null)
            {
                myData = line.Split(delimiter, StringSplitOptions.None);
    
                insertCmd.Append("INSERT INTO airnode VALUES(");
                insertCmd.Append("'" + myData[0] + "', ");
                insertCmd.Append(myData[1] + ", ");
                insertCmd.Append(myData[2] + ", ");
                insertCmd.Append(myData[3] + ", ");
                insertCmd.Append(myData[4] + ", ");
                insertCmd.Append(myData[5] + ", ");
                insertCmd.Append(myData[6] + ", ");
                insertCmd.Append(myData[7] + ", ");
                insertCmd.Append(myData[8] + ") ");
            }
    
            file.Close();
    
            SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True");
            SqlCommand cmd;
            con.Open();
            cmd = new SqlCommand(insertCmd.ToString(), con);
            cmd.CommandType = CommandType.Text;
            int affectedRows = cmd.ExecuteNonQuery();
            con.Close();
    Merci de m'aider

  2. #2
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Tu peux faire d'abord un select count(*) pour savoir si ta donnée existe. Suivant le résultat tu fais un update ou un insert.

    NB : utilises plutôt une requête paramétrée afin de sécuriser ton accès à la base de données

  3. #3
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par jbrasselet Voir le message
    Tu peux faire d'abord un select count(*) pour savoir si ta donnée existe. Suivant le résultat tu fais un update ou un insert.
    Et encapsuler le tout dans une PS car il serait un peu bizarre de faire un A/R Client-Serveur pour cette opération.

    NB : utilises plutôt une requête paramétrée afin de sécuriser ton accès à la base de données
    En plus, oui; il faudrait mettre cette phase en automatique

  4. #4
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Et encapsuler le tout dans une PS car il serait un peu bizarre de faire un A/R Client-Serveur pour cette opération.
    Oui en effet, ce serait encore l'étape suivante

  5. #5
    Membre chevronné Avatar de Pilru
    Homme Profil pro
    Dev ASP.NET/jQuery ; Admin ORACLE
    Inscrit en
    Septembre 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev ASP.NET/jQuery ; Admin ORACLE

    Informations forums :
    Inscription : Septembre 2007
    Messages : 491
    Par défaut
    Inclure ton code dans un Try...Catch évitera au framework .NET de lancer automatiquement l'exception.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Pilru Voir le message
    Inclure ton code dans un Try...Catch évitera au framework .NET de lancer automatiquement l'exception.
    Intercepter une exception sur clef dupliquée ne saurait constituer une méthode recommandable de design d'application.

    Pour être plus clair, c'est complétement pourrave de procéder ainsi.

    Si au taf je devais trouver ça dans un dev lors d'une revue de code, l'auteur se ferait sérieusement souffler dans les bronches.

  7. #7
    Membre chevronné Avatar de Pilru
    Homme Profil pro
    Dev ASP.NET/jQuery ; Admin ORACLE
    Inscrit en
    Septembre 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev ASP.NET/jQuery ; Admin ORACLE

    Informations forums :
    Inscription : Septembre 2007
    Messages : 491
    Par défaut
    Si L'objectif est d'éviter un plantage de l'appli sur un dup key, le try catch est une solution valable (pas la meilleure). Et permet le cas échéant de remonter un message "civilisé" à l'utilisateur.

    Pour être plus clair, c'est complétement pourrave de procéder ainsi.
    Pourquoi ?

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Pilru Voir le message
    Si L'objectif est d'éviter un plantage de l'appli sur un dup key, le try catch est une solution valable (pas la meilleure). Et permet le cas échéant de remonter un message "civilisé" à l'utilisateur.


    Pourquoi ?
    L'exception n'est pas une situation "normale", sa gestion est couteuse.
    Ici de plus on fait remonter au programme client une situation qui doit être filtrée au niveau de l'action demandée au SGBD.

  9. #9
    Membre chevronné Avatar de Pilru
    Homme Profil pro
    Dev ASP.NET/jQuery ; Admin ORACLE
    Inscrit en
    Septembre 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev ASP.NET/jQuery ; Admin ORACLE

    Informations forums :
    Inscription : Septembre 2007
    Messages : 491
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    L'exception n'est pas une situation "normale", sa gestion est couteuse.
    Couteuse ?

  10. #10
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Si l'objectif est de ne pas ajouter l'enregistrement lorsque la clé existe, tu peux ajouter un "WHERE NOT EXISTS (SELECT * FROM MATABLE WHERE ID = ID_QUE_J_INSERE)"

    a+

  11. #11
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Je pense que l'utilisation du try/catch dépend vraiment de ce que l'on veut faire exactement.
    Si on veut un message d'erreur pour repérer les lignes en erreur ça peut être très pratique. Si on s'en fout, autant faire une proc stock

  12. #12
    Membre chevronné Avatar de Pilru
    Homme Profil pro
    Dev ASP.NET/jQuery ; Admin ORACLE
    Inscrit en
    Septembre 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev ASP.NET/jQuery ; Admin ORACLE

    Informations forums :
    Inscription : Septembre 2007
    Messages : 491
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Si l'objectif est de ne pas ajouter l'enregistrement lorsque la clé existe, tu peux ajouter un "WHERE NOT EXISTS (SELECT * FROM MATABLE WHERE ID = ID_QUE_J_INSERE)"

    a+
    Sauf erreur de ma part, un ordre INSERT ne prend pas de clause WHERE

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Pilru Voir le message
    Sauf erreur de ma part, un ordre INSERT ne prend pas de clause WHERE
    Non, mais on peut très bien scripter :

    IF NOT EXISTS(....)
    INSERT .....

    Ce qui est nettement plus logique que de retourner une erreur vers le client.

  14. #14
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par Pilru Voir le message
    Sauf erreur de ma part, un ordre INSERT ne prend pas de clause WHERE
    Testé avec SQL Server :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @t TABLE(id int, lab varchar(50));
    INSERT INTO @t (id, lab) (SELECT 1, 'test1' WHERE NOT EXISTS (SELECT * FROM @t WHERE id = 1));
    INSERT INTO @t (id, lab) (SELECT 1, 'test2' WHERE NOT EXISTS (SELECT * FROM @t WHERE id = 1));
    SELECT * FROM @t

  15. #15
    Membre chevronné Avatar de Pilru
    Homme Profil pro
    Dev ASP.NET/jQuery ; Admin ORACLE
    Inscrit en
    Septembre 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev ASP.NET/jQuery ; Admin ORACLE

    Informations forums :
    Inscription : Septembre 2007
    Messages : 491
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Testé avec SQL Server :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @t TABLE(id int, lab varchar(50));
    INSERT INTO @t (id, lab) (SELECT 1, 'test1' WHERE NOT EXISTS (SELECT * FROM @t WHERE id = 1));
    INSERT INTO @t (id, lab) (SELECT 1, 'test2' WHERE NOT EXISTS (SELECT * FROM @t WHERE id = 1));
    SELECT * FROM @t
    OK, ce n'est donc pas un ordre insert avec une clause where.

  16. #16
    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 : 39
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    MERGE peut être pas mal aussi!

Discussions similaires

  1. [2012] MERGE - Violation of PRIMARY KEY constraint
    Par vinch999 dans le forum Développement
    Réponses: 2
    Dernier message: 21/01/2015, 10h35
  2. Réponses: 2
    Dernier message: 21/10/2014, 15h44
  3. [2008] Erreur d'exécution d'un lot SSIS: violation de Primary key
    Par lamen0031 dans le forum SSIS
    Réponses: 3
    Dernier message: 07/02/2013, 13h06
  4. Violation of Primary Key sans données
    Par Baquardie dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 26/01/2010, 19h41
  5. Violation of PRIMARY KEY constraint
    Par DEV-10 dans le forum Développement
    Réponses: 6
    Dernier message: 30/11/2009, 15h01

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