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

C# Discussion :

Code verifant l'existence d'une ligne par la clé primaire avant insertion dans la base [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant stagiaire
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Etudiant stagiaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Code verifant l'existence d'une ligne par la clé primaire avant insertion dans la base
    Salut à tous!
    J'ai le code suivant. Lorsque j'insère une données dont la clé primaire n'existes pas dans la table, l'insertion se déroule bien avec même un message de confirmation. Mais lorsque je rentre une ligne dont la clé primaire exite déjà voici le message suivant:

    Violation de la contrainte PRIMARY KEY 'PK_Reglmtcli'. Impossible d'insérer une clé en double dans l'objet 'dbo.Reglmtcli'.
    L'instruction a été arrêtée.
    Au fait, je voudrai qu'au moment de l'insertion il y ai d'abord une sorte de verification de l'existence de la clé puis ,s'il existe ,un message de confirmation qu'une ligne ayant une telle clé exite déjà.
    Sinon, le code insere les donnees.
    Voici le code en question:

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     public string RempApos(string str)
            {
                return str.Replace("'", "''");
            }
     
     
     
            void BT_Send_Click(object sender, EventArgs e)
            {
     
                // Déclaration de l'objet de connexion
                System.Data.SqlClient.SqlConnection oConnection;
     
                // Création de l'objet de connexion
                oConnection = new System.Data.SqlClient.SqlConnection();
     
                // Paramétrage de la chaîne de connexion
                string sConnectionString;
                sConnectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=Database1.mdf;Integrated Security=True;User Instance=True;Context Connection=False;";
                sConnectionString = sConnectionString + " Trusted_Connection=True;";
                oConnection.ConnectionString = sConnectionString;
     
     
                // Connexion à la base de données
                oConnection.Open();
     
                // Déclaration de l'objet SqlCommand et de la requête SQL
                System.Data.SqlClient.SqlCommand oCommand;
                string sSQL;
     
                //Ecriture de la requête
     
                sSQL = "INSERT INTO [Reglmtcli](Numreg,Codecli,Nomcli,Objet,Datereg,Modepay,Montant,RestImpu,Encourcli,Codebanq,Codegui,Numcmpte,CleRib,Domicili,Titulaire,Numcheq,Datecheq,Observation)";
                sSQL = sSQL + " VALUES('" + ZeNumreg.Text + "','" + ZeCodecli.Text + "','" + RempApos(ZeNomcli.Text) + "','" + RempApos(ZeObjet.Text) + "','" + ZeDatereg.Text + "','" + ZeModepay.Text + "','" + ZeMontant.Text + "','" + ZeRestImpu.Text + "','" + ZeEncourcli.Text + "','" + ZeCodebanq.Text + "','" + ZeCodegui.Text + "','" + ZeNumcmpte.Text + "','" + ZeCleRib.Text + "','" + ZeDomicili.Text + "','" + RempApos(ZeTitulaire.Text) + "','" + ZeNumcheq.Text + "','" + ZeDatecheq.Text + "','" + RempApos(ZeObservation.Text) + "')";
     
     
                // Création de l'objet SqlCommand
                oCommand = new System.Data.SqlClient.SqlCommand(sSQL, oConnection);
     
                // On appelle la méthode ExecuteNonQuery pour éxécuter notre commande
                oCommand.ExecuteNonQuery();
     
                // On écrit notre message de confirmation
                LB_Message.Text = "Le reglement n° " + ZeNumreg.Text + " a été enregistré !";
     
                // On rend le message visible
                LB_Message.Visible = true;
     
                // Fermeture de la connexion
                oConnection.Close();
     
            }
    Merci d'avance !

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Tu peux simplement mettre un Try Catch, et dépendant de l'erreur retournée tu affiches ton message.

    Sinon tu fais un bête SELECT pour voir si ta clé existe. Mais ça implique de faire 2 requêtes à chaque fois que tu veux insérer.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Etudiant stagiaire
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Etudiant stagiaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Au fait, j'ai essayé ce que tu dis là. Mais le pb c'est que ça ne marche pas! Au fait, je voudrai avoir un petit exemple pour avoir une idée.

    EDIT
    Voici en effet le code que j'ai écrit, mais ça marche pas!

    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
     SqlCommand oCommand = new SqlCommand("SELECT * FROM  Accès  WHERE Nom ='" + ZeNomUtilisateur + "'", oConnexion);
                try
                {
                    // Ouverture de la connexion et exécution de la requête
                    oConnexion.Open();
     
                    //Exécution de requête SQL
     
                    SqlDataReader drUtilisateur = oCommand.ExecuteReader();
     
                    // Parcours de la liste des utilisateurs
     
                    while (drUtilisateur.Read())
                    {
                        if (drUtilisateur["Nom"].ToString() == ZeNom) 
                        {
                            lb_Message.Text="Cet enregistrement existe déjà"
                        }
               else
               {
     
                // On appelle la méthode ExecuteNonQuery pour éxécuter notre commande
                oCommand.ExecuteNonQuery();
     
                // On écrit notre message de confirmation
                LB_Message.Text = "Le reglement n° " + ZeNumreg.Text + " a été enregistré !";
     
                // On rend le message visible
                LB_Message.Visible = true;
     
                // Fermeture de la connexion
                oConnection.Close();
     
            }


    Merci d'avance!

  4. #4
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 106
    Points
    3 106
    Par défaut
    Moutombi, tu essayes d'insérer un enregistrement avec une requête SELECT ?

    Comme nous te le disions hier, la meilleure chose à faire et de se poser une journée pour lire et comprendre des tutoriaux sur le développement en .Net.
    Là, il te manque les bases et tu buteras sans cesse sur des questions simples tant que tu n'auras pas fait l'effort de te documenter un minimum.

    Qui plus est, utilise des requêtes paramétrées plutôt que des requêtes avec concaténation.
    Tes requêtes seront sécurisées et plus lisibles.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Etudiant stagiaire
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Etudiant stagiaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Code permettant de verifier ....
    Au fait, j'ai utilisé try catch comme a suggéré PatteDePoule, et voici ce que ça donne. Mais apparament le code ne fais rien.
    Voici le bout de code.
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
            public string RempApos(string str)
            {
                return str.Replace("'", "''");
            }
     
     
     
            void BT_Send_Click(object sender, EventArgs e)
            {
     
                // Déclaration de l'objet de connexion
                System.Data.SqlClient.SqlConnection oConnection;
     
                // Création de l'objet de connexion
                oConnection = new System.Data.SqlClient.SqlConnection();
     
                // Paramétrage de la chaîne de connexion
                string sConnectionString;
                sConnectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=Database1.mdf;Integrated Security=True;User Instance=True;Context Connection=False;";
                sConnectionString = sConnectionString + " Trusted_Connection=True;";
                oConnection.ConnectionString = sConnectionString;
     
     
     
     
                // Déclaration de l'objet SqlCommand et de la requête SQL
                System.Data.SqlClient.SqlCommand oCommand;
                string sSQL;
     
                //Ecriture de la requête
     
                sSQL = "INSERT INTO [Reglmtcli](Numreg,Codecli,Nomcli,Objet,Datereg,Modepay,Montant,RestImpu,Encourcli,Codebanq,Codegui,Numcmpte,CleRib,Domicili,Titulaire,Numcheq,Datecheq,Observation)";
                sSQL = sSQL + " VALUES('" + ZeNumreg.Text + "','" + ZeCodecli.Text + "','" + RempApos(ZeNomcli.Text) + "','" + RempApos(ZeObjet.Text) + "','" + ZeDatereg.Text + "','" + ZeModepay.Text + "','" + ZeMontant.Text + "','" + ZeRestImpu.Text + "','" + ZeEncourcli.Text + "','" + ZeCodebanq.Text + "','" + ZeCodegui.Text + "','" + ZeNumcmpte.Text + "','" + ZeCleRib.Text + "','" + ZeDomicili.Text + "','" + RempApos(ZeTitulaire.Text) + "','" + ZeNumcheq.Text + "','" + ZeDatecheq.Text + "','" + RempApos(ZeObservation.Text) + "')";
     
     
                // Création de l'objet SqlCommand
                oCommand = new System.Data.SqlClient.SqlCommand(sSQL, oConnection);
     
                //
     
                SqlCommand oCmd = new SqlCommand("SELECT * FROM  Reglmtcli  WHERE Nom ='" + ZeNumreg + "'", oConnection);
     
                try
                {
     
                    // Connexion à la base de données
                    oConnection.Open();
     
                    //Exécution de requête SQL
     
                    SqlDataReader drReglmtcli = oCmd.ExecuteReader();
                    while (drReglmtcli.Read())
                    {
                        if (drReglmtcli.HasRows)
                        {
                            Console.Write("Enregistrement existant");
                        }
                        else
                        {
                            // On appelle la méthode ExecuteNonQuery pour éxécuter notre commande
                            oCommand.ExecuteNonQuery();
     
                            // On écrit notre message de confirmation
                            LB_Message.Text = "Le reglement n° " + ZeNumreg.Text + " a été enregistré !";
     
     
                            // On rend le message visible
                            LB_Message.Visible = true;
                        }
                    }
                }
                catch
                {
     
     
                    // Fermeture de la connexion
                    oConnection.Close();
     
                }
            }

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Tu mélanges tout !

    Déjà, on dit pas "au fait", mais "en fait" dans le contexte que tu utilises

    Sinon, tu as deux solutions :

    Solution 1 : Recommandée. Tu ne vérifies rien avant l'insertion dans la base, et tu gères l'erreur s'il y en a une. C'est ce qu'il y a de plus rapide et de plus fiable.

    Solution 2 : Déconseillée. Tu recherches la présence de la ligne dans la base, et s'il n'y a rien, tu insères les données. Deux fois plus lentes (deux accès à la base) et non fiable (une autre personne peut insérer la ligne entre le moment où tu vérifies qu'elle n'existe pas, et le moment où tu l'insères).


    Pour mettre en place la solution 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    cmd.CommandText = "..."; // Par pitié, utilise une requête paramétrée, et pas ton capharnaüm géant !
     
    try
    {
       cmd.ExecuteNonQuery();
       Console.Write("Youpi tralala");
    }
    catch
    {
       Console.Write("Boum !");
    }
    Et c'est tout !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Etudiant stagiaire
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Etudiant stagiaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Peux-tu à partir de mon code me donner un exemple de requêtes paramètrées ? Parceque je ne vois toujours au sujet de cette affaire de requêtes paramètrées.

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Points : 560
    Points
    560
    Par défaut
    ici

  9. #9
    Membre à l'essai
    Homme Profil pro
    Etudiant stagiaire
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Etudiant stagiaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Merci SpringBuilder! Ta méthode marche ,sauf que j'ai pas utiliser les requêtes paramétrées.
    Voici mon code final:
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    public string RempApos(string str)
            {
                return str.Replace("'", "''");
            }
     
     
     
            void BT_Send_Click(object sender, EventArgs e)
            {
     
                // Déclaration de l'objet de connexion
                System.Data.SqlClient.SqlConnection oConnection;
     
                // Création de l'objet de connexion
                oConnection = new System.Data.SqlClient.SqlConnection();
     
                // Paramétrage de la chaîne de connexion
                string sConnectionString;
                sConnectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=Database1.mdf;Integrated Security=True;User Instance=True;Context Connection=False;";
                sConnectionString = sConnectionString + " Trusted_Connection=True;";
                oConnection.ConnectionString = sConnectionString;
     
     
     
     
                // Déclaration de l'objet SqlCommand et de la requête SQL
                System.Data.SqlClient.SqlCommand oCommand;
                string sSQL;
     
                //Ecriture de la requête
     
                sSQL = "INSERT INTO [Reglmtcli](Numreg,Codecli,Nomcli,Objet,Datereg,Modepay,Montant,RestImpu,Encourcli,Codebanq,Codegui,Numcmpte,CleRib,Domicili,Titulaire,Numcheq,Datecheq,Observation)";
                sSQL = sSQL + " VALUES('" + ZeNumreg.Text + "','" + ZeCodecli.Text + "','" + RempApos(ZeNomcli.Text) + "','" + RempApos(ZeObjet.Text) + "','" + ZeDatereg.Text + "','" + ZeModepay.Text + "','" + ZeMontant.Text + "','" + ZeRestImpu.Text + "','" + ZeEncourcli.Text + "','" + ZeCodebanq.Text + "','" + ZeCodegui.Text + "','" + ZeNumcmpte.Text + "','" + ZeCleRib.Text + "','" + ZeDomicili.Text + "','" + RempApos(ZeTitulaire.Text) + "','" + ZeNumcheq.Text + "','" + ZeDatecheq.Text + "','" + RempApos(ZeObservation.Text) + "')";
     
     
                // Création de l'objet SqlCommand
                oCommand = new System.Data.SqlClient.SqlCommand(sSQL, oConnection);
     
     
     
     
     
     
                try
                {
                    // Connexion à la base de données
                    oConnection.Open();
     
                    // On appelle la méthode ExecuteNonQuery pour éxécuter notre commande
                    oCommand.ExecuteNonQuery();
                    LB_Message.Text ="Règlement créer avec succès!";
     
                    // Fermeture de la connexion
                    oConnection.Close();
     
                }
                catch 
                {
     
                    //Exécution de requête SQL
     
                    Err_Message.Text ="Cet règlement existe déjà!";
     
                }
            }

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

Discussions similaires

  1. [VB 2005][DatagridView] Ajouter une ligne par code
    Par RaelRiaK dans le forum VB.NET
    Réponses: 3
    Dernier message: 23/01/2007, 22h54
  2. afficher une ligne(par son numero) d'une JTable
    Par linouline dans le forum Composants
    Réponses: 7
    Dernier message: 27/05/2006, 14h11
  3. Réponses: 9
    Dernier message: 22/05/2006, 12h21
  4. [SELECT DISTINCT] [Débutant] Ne garder qu'une ligne par id
    Par toniolol dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 12/12/2005, 16h07
  5. Réponses: 3
    Dernier message: 29/08/2005, 16h44

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