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

VB.NET Discussion :

Ajout d'un élément avec control des doublons dans la BDD depuis le code vb.net


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Ajout d'un élément avec control des doublons dans la BDD depuis le code vb.net
    Bonjour à tous,

    Je souhaite aller plus loin. J’entre les éléments des tableaux de ma base de données en utilisant une InputBox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim NewCable As String = InputBox("Ajouter Un Type de Cable", "Nouveau", "Entrer", 4, 4)
    Dim RequeteCable As String = "Insert into Cables(Type) values ('" + NewCable + "')"
    cela marche sans probleme.
    Toutefois, je ne parviens pas à gérer les doublons. Je voudrai qu’une MsgBox s’ouvre et affiche un message de doublon sans ajouter l’élément dans la table chaque fois que ce dernier existe déjà dans la table. Lorsque l’élément n’existe pas encore, la MsgBox m’indique qu’un nouvel élément vient d’être ajouté. Qui a une idée?

    Merci

  2. #2
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Voici comment je procédérai:
    - Je créer un index sur le champ Type de la table Cable. Je mets sa propriété Is Unique à Yes.
    - Puis dans mon code, je fais un truc du genre:
    Code vb.net : 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
    Dim newCable As String = InputBox("Ajouter Un Type de Cable", "Nouveau", "Entrer", 4, 4)
     
            If Len(Trim(newCable)) > 0 Then
                Dim strConn As String = "Server=DEV-PC;Database=MaBase;Trusted_Connection=True;"
     
                Using connection As New SqlConnection(strConn)
     
                    Try
                        connection.Open()
                        'MessageBox.Show("Connection ouverte")
                        Dim requete As String = "INSERT INTO Cables (Type) VALUES (@TypeCable)"
                        Dim myCommand As SqlCommand = New SqlCommand(requete, connection)
     
                        myCommand.Parameters.Add(New SqlParameter("@TypeCable", SqlDbType.VarChar))
     
                        myCommand.Parameters("@TypeCable").Value = newCable
     
                        myCommand.ExecuteNonQuery()
     
                        MessageBox.Show("Nouvelle ligne ajoutée avec succès!", "Cool", MessageBoxButtons.OK, MessageBoxIcon.Information)
     
                    Catch ex As Exception
     
                        If ex.HResult = -2146232060 Then
                            MessageBox.Show("Ce cable existe déjà dans la base de données", "Risque de doublons", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        Else
                            MessageBox.Show("Erreur : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        End If
     
                    End Try
     
                End Using
     
            Else
                MessageBox.Show("Aucun type de cable saisi", "Pas de données fournies", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
    Etant donnée la contrainte au niveau de la base de données, une exception sera levée en cas de doublon dans le champ sur lequel j'ai mis l'index. Je récupère donc cette exception correspondant au doublon et effectue le traitement qu'il faut.

  3. #3
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Je plussoie la réponse de Callo, et préciserais que tu devrais gérer la saisie pour éviter des doublons.


    Sinon tu risque d'avoir des doublons comme "paire torsadée", "paire torsadee", "PAIRE torsadee", "PAIRE TORSADEE", etc.


    Tu peux enlever les caractères et mettre en majuscule à l'insertion.

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Le mieux pour ça, ça reste de passer par une table de référence (clef étrangère) dans laquelle tu stockeras les types de cables. C'est ce qu'on appelle l'intégrité référentielle.

    Le contrôle de l'intégrité référentielle doit se faire via le SGBD et non dans l'application (ce que tu cherches visiblement à faire), car il est fait pour ça et ça t'évite de réinventer la roue (ce qu'_Ez3kiel propose un peu de faire ).

    Il faudrait donc rajouter une colonne "Id" dans la table "Cables" en tant que clef primaire. Tu pourras ainsi utiliser cette colonne comme clef étrangère dans tes autres tables.

  5. #5
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Au début j'avais pensé à une table référentielle, puis je me suis dit "Pourquoi il ferait une appli pour remplir une table de référence ligne par ligne ... ?" Surtout s'il rentre directement le texte sans traitement

    Et pour l'index je n'ai pas proposé car pour moi cela va de soit et la requête Insert into Cables(Type) values ('" + NewCable + "') peut induire qu'il y a un ID autoInc géré par le Sgbd ..

    Donc je me suis dit qu'il devait y avoir une autre finalité, et j'ai pas cherché plus loin, j'ai juste répondu à la question.

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par _Ez3kiel Voir le message
    Au début j'avais pensé à une table référentielle, puis je me suis dit "Pourquoi il ferait une appli pour remplir une table de référence ligne par ligne ... ?" Surtout s'il rentre directement le texte sans traitement
    Il vaut mieux toujours faire un petit contrôle, ça coûte quelques lignes de code et ça permet de garder un truc clean ^^

    Citation Envoyé par _Ez3kiel Voir le message
    Et pour l'index je n'ai pas proposé car pour moi cela va de soit et la requête Insert into Cables(Type) values ('" + NewCable + "') peut induire qu'il y a un ID autoInc géré par le Sgbd ..
    On est d'accord, en principe ça va de soit, mais bon on voit tellement de choses aberrante sur les modélisations de bases de données qu'il vaut mieux se méfier

    Citation Envoyé par _Ez3kiel Voir le message
    Donc je me suis dit qu'il devait y avoir une autre finalité, et j'ai pas cherché plus loin, j'ai juste répondu à la question.
    Pas de soucis En fait quand je vois des membres qui reçoivent des réponses qui me font penser à une autre solution, j'essaie de voir si on peut conseiller de revenir dans les clous. Mais là effectivement on ne sait pas encore ce qu'il en est.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    J'ai appliqué la méthode de callo mais j'ai une erreur qui se signalée.
    Le message indiquant l'erreur dit:

    'System.Exception.Protected Property HResult As Integer' n'est pas
    accessible dans ce contexte, car il est 'Protected'.

    Ce qui fait que le code ne tourne pas jusqu'à la fin.
    Cette erreur est produite par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ex.HResult = -2146232060
    Qui voit ce qu'il faut faire?

  8. #8
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Je suppose que la proposition un peu plus propre de DotNetMatt ne t'as pas convaincu, j'espère que ton appli/bdd n'aura pas trop à évoluer sinon tu risques de devoir refaire tout ou colmatage sur colmatage ...

    Sinon pour répondre à ton souci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If System.Runtime.InteropServices.Marshal.GetHRForException(ex) = -2146232060 Then
                            MessageBox.Show("Ce cable existe déjà dans la base de données", "Risque de doublons", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        Else
                            MessageBox.Show("Erreur : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        End If

  9. #9
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Pourrait-ton voir le code?
    As-tu essayer d'appliquer les recommendations de DotNetMatt?
    EDIT: grillé par _Ez3kiel

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    tester quelque chose en fonction de la présence d'une erreur n'est que le dernier recours quand on a pas trouvé mieux
    lever une exception est couteux en performances

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if exists (select 1 from table where col_unique = @value)  
        select 0
    insert into ...
    select 1
    (ca n'empeche pas de mettre un index unique si la colonne doit être unique)

    sinon à ce qu'on compte là pour vérifier la présence d'un fichier on faire un try catch avec une ouverture du fichier alors qu'il y a l'instruction exist

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Je veux revenir sur la méthode de DotNetMatt car l'appli sera un peu lourde.
    Mais au fait, en quoi consiste vraiment cette méthode?
    Et le traitement de texte auquel faisait _Ez3kiel
    Faut peut-être vous dire que je suis à mes début mais je suis très déterminé, donc, un peu de temps pour apprendre d'avantage.
    Mais comme je l’ai déjà dit, j’ai créé la BDD avec sql Server, je l’ai importée dans le code VB.net et je voudrai la remplir à partir d’une InputBox (chose que je fais sans pb, mais alors les doublons).

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Personnellement, avant de s'attaquer au code de l'application, je dirais qu'il vaudrait d'abord mieux s'assurer que la DB est correctement modélisée/normalisée.

    Le codage de l'applicatif n'en sera que facilité.

Discussions similaires

  1. [AC-2007] Fusion d’enregistrement avec suppression des doublons dans champs multivaleur
    Par Daniel-Gérald dans le forum VBA Access
    Réponses: 1
    Dernier message: 15/09/2011, 04h20
  2. [MySQL] Controler des doublons
    Par Telecaster dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/10/2009, 09h57
  3. Formulaire en plusieurs parties ? (avec controle des erreurs)
    Par fabseven dans le forum Ruby on Rails
    Réponses: 0
    Dernier message: 04/04/2008, 16h23
  4. problème avec la suppression des doublons dans arraylsit
    Par ulysse031 dans le forum Langage
    Réponses: 13
    Dernier message: 04/03/2007, 12h52
  5. Prbleme de liaison avec des doublons dans le fichier lié.
    Par krak70 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/10/2005, 11h03

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