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 dans une BD depuis VB [Débutant]


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Ajout dans une BD depuis VB
    Bonjour tout le monde ,

    Bref , je suis débutant en VB et j'ai commencer par un tp d'ajout d'un Client dans une table Tclient(NumCli,NomCli,AdrCli,VilCli,TelCli) depuis VB , donc j'ai crée la form avec les textes boxes et tout , les conditions d'ajout c'est que le NumCli s'affiche directement dans la forme càd que l utilisateur ne peux pas choisir son numcli , il s'incrémente et s'affiche sans pouvoir le modifier . Puis la condition TelCli doit contenir 10 chiffres et commencer par 06 . La dernière condition c'est que tout les textes boxes soient rempli pour pouvoir ajouter .

    Nom : add.png
Affichages : 159
Taille : 7,6 Ko

    Pour le code voilà ce que j'ai fais , il me faut un peu d'aide il y a des erreurs , ça serai généreux de votre part


    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
    Public Class NewClient
     
    Public Const chainedeconnexion As String = "Provider=SQLNCLI10;Data Source=BADR;Integrated Security=SSPI;Initial Catalog=TPSMI6"
     
    Public DBConnexion As New System.Data.OleDb.OleDbConnection(chainedeconnexion)
     
    Dim InsertCommand As New OleDb.OleDbCommand()
     
     
     
    Private Sub NewClient_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     
    InsertCommand.Connection = DBConnexion
     
    End Sub
     
     
     
    'Boutton Ajouter
     
    Private Sub BtnNewClient_Click(sender As Object, e As EventArgs) Handles BtnNewClient.Click
     
    If TxtNomClient.Text <> "" And TxtAdrClient.Text <> "" And TxtVilClient.Text <> "" And TxtTelClient.Text <> "" Then
     
    If Len(TxtTelClient.Text) <> 10 Or Mid(TxtTelClient.Text, 1, 2) <> "06" Then
     
    MessageBox.Show("Veuillez entrer un numéro de téléphone valide !", "ERREUR", MessageBoxButtons.OK, MessageBoxIcon.Error)
     
     End If
     
    DBConnexion.Open()
     
    InsertCommand.CommandText = "insert into Tclient(NumCli,NomCli,AdrCli,VilCli,TelCli) select count(*)+1,'" + TxtNomClient.Text + "','" + TxtAdrClient.Text + "','" + TxtVilClient.Text + "','" + TxtTelClient.Text + "' from Tclient"
     
    InsertCommand.ExecuteNonQuery()
     
    MessageBox.Show("Nouveau Client Ajouté !", "Nouveau Client", MessageBoxButtons.OK, MessageBoxIcon.Information)
     
    DBConnexion.Close()
     
    Me.Close()
     
    End If
     
     
     
    End Sub



    Pour les boutons Vider et Fermer c'est facile je l'ai ais fais

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Il faut utiliser les requêtes paramétrées. Voir Tuto ou Faq.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    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 239
    Points
    4 239
    Par défaut
    Bonjour,

    Je ne peux qu'insister sur l'importance d'utiliser des requêtes paramétrées comme indiqué par Hervé.

    Ensuite, d'après le provider que vous indiquez dans votre chaîne de connexion, vous travaillez avec MS SQL Server. Si c'est bien correct, utilisez les classes prévues à cet effet dans System.Data.SqlClient.

    Ensuite, puisque vous travaillez avec un SGDBR digne de ce nom, n'hésitez pas à utiliser des procédures stockées si vous en avez la possibilité (i.e. si vous avez le droit d'en créer ou que votre DBA accepte de vous les créer). Je n'ai pas encore réussi à trouver un seul inconvénient à leur utilisation.

    Dans votre If de vérification que toutes les textboxes sont bien remplies, utilisez AndAlso plutôt que And. Le premier ne prend plus la peine de tester les autres expression à partir du moment où il en rencontre une n'étant pas vérifiée. Le second les testera toutes (dans certains cas, cela peut avoir des conséquences fâcheuses).
    Idem pour l'utilisation de Or. Préférez-lui OrEsle.
    Kropernic

  4. #4
    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
    Première remarque
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert Into Tclient(id,nom) select count(*)+1, 'Toto' From Tclient
    ce n'est pas la bonne syntaxe (voir même une nouvelle syntaxe inconnue ). EDIT: Bon ba non en fait, cette syntaxe existe bien ...
    Si dans ta table, ton champs id est de type auto-inc, alors tu as juste a faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InsertCommand.CommandText = "insert into Tclient(NomCli,AdrCli,VilCli,TelCli) VALUES ('" & TxtNomClient.Text & "','" & TxtAdrClient.Text & "','" & TxtVilClient.Text & "','" & TxtTelClient.Text & "')"
    Mais comme rv26t l'a dit, je te conseille les requêtes paramétrées, c'est plus mieux.



    2éme remarque : Erreur de test à ce niveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    If Len(TxtTelClient.Text) <> 10 Or Mid(TxtTelClient.Text, 1, 2) <> "06" Then
     
    MessageBox.Show("Veuillez entrer un numéro de téléphone valide !", "ERREUR", MessageBoxButtons.OK, MessageBoxIcon.Error)
     
     End If
     
    DBConnexion.Open()
     
    InsertCommand.CommandText = "insert into Tclient(NumCli,NomCli,AdrCli,VilCli,TelCli) select count(*)+1,'" + TxtNomClient.Text + "','" + TxtAdrClient.Text + "','" + TxtVilClient.Text + "','" + TxtTelClient.Text + "' from Tclient"
     
    InsertCommand.ExecuteNonQuery()
    Tu testes le numéro de téléphone et s'il n'est pas bon, tu affiches un message d'erreur, MAIS tu continues l'insertion après le message d'erreur, il te faut un else.

    3éme remarque, tu as l'air de vouloir apprendre le Vb.NET, alors pourquoi ne pas faire une Classe Client avec des Properties Nom/Adresse/Ville/Telephone etc, ce serait un bon entrainement.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  5. #5
    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 239
    Points
    4 239
    Par défaut
    Citation Envoyé par _Ez3kiel Voir le message
    Première remarque
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert Into Tclient(id,nom) select count(*)+1, 'Toto' From Tclient
    ce n'est pas la bonne syntaxe (voir même une nouvelle syntaxe inconnue ).
    Je sais qu'on est vendredi et que je suis fatigué mais en quoi cette syntaxe est-elle incorrect ? Pour moi, syntaxiquement, c'est tout à fait correct. Par contre, on est bien d'accord que fonctionnellement, cela pourrait amener pas mal de problèmes au niveau des accès concurrentiels (ajout de client par 2 utilisateurs en même temps --> 2 clients avec le même id ). Le mieux est bien sûr, comme tu l'as indiqué, d'utiliser une colonne auto incrémentée.

    Pour en revenir à la syntaxe, je relis encore car tu n'es pas du genre à dire des conneries...

    Mais syntaxiquement, si je n'ai pas envie d'utiliser une clause VALUES, rien ne m'interdit d'écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO MATABLE (COL1, COL2, COL3)
    SELECT
        VAL1,
        VAL2,
        VAL3
    Dans ce cas-ci, VAL1, VAL2 et VAL3 seraient probablement des variables ou directement des valeurs en dur mais rien n'interdit de les tirer d'une table (la même que celle d'insertion ou une autre).
    Kropernic

  6. #6
    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
    Citation Envoyé par Kropernic Voir le message
    Pour en revenir à la syntaxe, je relis encore car tu n'es pas du genre à dire des conneries...
    Détrompe-toi ! Je manque cruellement d'expérience en SQL ! Et pour preuve, j'étais persuadé que cette syntaxe de requête était inédite ... Je ne suis toujours passé que par des Insert 'Classiques' (Insert Into table(,,) values (,,) )

    Après un peu de doc, effectivement la syntaxe est bonne, mais du coup en relisant sa requête je me rend compte que ça va difficilement marcher, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert [...] select count(*)+1,'" + TxtNomClient.Text + "','" + TxtAdrClient.Text + "','" + TxtVilClient.Text + "','" + TxtTelClient.Text + "' from Tclient
    Ca ne va pas donner quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert into table(id,nom,prenom) select count(*)+1, toto, tata from Tclient
    Où toto et tata sont des valeurs saisies dans les Txtbox et non des noms de colonnes ce qui va faire cracher une exception pour Identificateur non valide ? Ou je me suis -encore- trompé ?
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  7. #7
    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 239
    Points
    4 239
    Par défaut
    Citation Envoyé par _Ez3kiel Voir le message
    Détrompe-toi ! Je manque cruellement d'expérience en SQL ! Et pour preuve, j'étais persuadé que cette syntaxe de requête était inédite ... Je ne suis toujours passé que par des Insert 'Classiques' (Insert Into table(,,) values (,,) )

    Après un peu de doc, effectivement la syntaxe est bonne, mais du coup en relisant sa requête je me rend compte que ça va difficilement marcher, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert [...] select count(*)+1,'" + TxtNomClient.Text + "','" + TxtAdrClient.Text + "','" + TxtVilClient.Text + "','" + TxtTelClient.Text + "' from Tclient
    Ca ne va pas donner quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert into table(id,nom,prenom) select count(*)+1, toto, tata from Tclient
    Où toto et tata sont des valeurs saisies dans les Txtbox et non des noms de colonnes ? Ou je me suis -encore- trompé ?
    Si je vois bien, il a bien mis des apostrophes avant et après les guillemets entourant les variables. Tu as donc oublié les apostrophes autour de toto et tata ta requête.
    Syntaxiquement, la requête est donc valide. Nombre de lignes + 1 dans la colonne id ; la valeur "toto" dans la colonne nom ; la valeur "tata" dans la colonne prenom.
    Kropernic

  8. #8
    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
    Quelle est la version de SQL Server utilisée ? Si c'est 2012 (ou 2014), il est possible d'utiliser les Séquences : Tout savoir sur SEQUENCE avec SQL Server 2012, c'est quand même plus propre

    En plus avec COUNT + 1, si jamais il y a des suppressions entre temps, rien n'empêche d'obtenir une clef en doublon, ce qui interdirait toute insertion... Ce n'est pas safe.

    [EDIT] : Si l'utilisation de SEQUENCE n'est pas envisageable, alors il faut mettre en place un mécanisme un peu plus évolué, par exemple en passant par une procédure stockée, qui permettra de vérifier que l'ID est disponible et éventuellement de le réserver pour éviter les problèmes de concurrence.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  9. #9
    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 temps pour moi, je viens de tester sur toad et ça passe ! Je n'aurais jamais pensé qu'on pouvait mettre autre chose que des noms de colonnes ou des fonctions SQL entre le SELECT et le FROM.

    Je me coucherais moins bête ce soir.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  10. #10
    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 239
    Points
    4 239
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Quelle est la version de SQL Server utilisée ? Si c'est 2012 (ou 2014), il est possible d'utiliser les Séquences : Tout savoir sur SEQUENCE avec SQL Server 2012, c'est quand même plus propre

    En plus avec COUNT + 1, si jamais il y a des suppressions entre temps, rien n'empêche d'obtenir une clef en doublon, ce qui interdirait toute insertion... Ce n'est pas safe.

    [EDIT] : Si l'utilisation de SEQUENCE n'est pas envisageable, alors il faut mettre en place un mécanisme un peu plus évolué, par exemple en passant par une procédure stockée, qui permettra de vérifier que l'ID est disponible et éventuellement de le réserver pour éviter les problèmes de concurrence.
    Il a déjà été signalé que faire COUNT+1, c'est pas bien. Mais la raison de la suppression n'a pas été évoqué. J'avais donné l'exemple de l'ajout simultané. Mais dans un cas comme dans l'autre, ça fout le bordel. Et même s'il n'est pas en 2012 (ou 2014), il y a toujours les colonnes IDENTITY qui sont là pour ça !

    [VENDREDI]
    Si les modos commence à flood le forum, où va-t-on ?
    [/VENDREDI]
    Kropernic

  11. #11
    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 Kropernic Voir le message
    Il a déjà été signalé que faire COUNT+1, c'est pas bien. Mais la raison de la suppression n'a pas été évoqué. J'avais donné l'exemple de l'ajout simultané.
    Effectivement je n'avais pas vu que tu l'avais déjà mentionné, j'ai lu en diagonale

    Citation Envoyé par Kropernic Voir le message
    il y a toujours les colonnes IDENTITY qui sont là pour ça !
    Oui en effet, mais les SEQUENCE offrent beaucoup plus de flexibilité que les colonnes IDENTITY. Elles sont également plus performantes, puisque la valeur suivante est récupérée à partir de la mémoire et non du disque.De plus, une séquence n'est pas liée à une table en particulier, on peut générer les nombres de manière ascendante ou descendante, ou encore créer des cycles, etc. Il est aussi possible de récupérer plusieurs valeurs d'un coup en passant par la procédure stockée sp_sequence_get_range.

    Voir la doc MSDN pour plus d'infos : Sequence Numbers

    Citation Envoyé par Kropernic Voir le message
    [VENDREDI]
    Si les modos commence à flood le forum, où va-t-on ?
    [/VENDREDI]
    Justement c'est Vendredi, tout est permis (ou pas )
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Merci pour votre aide , j'ai corrigé mes erreurs , le code fonctionne correctement

  13. #13
    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 239
    Points
    4 239
    Par défaut
    Citation Envoyé par rpedro0921 Voir le message
    Merci pour votre aide , j'ai corrigé mes erreurs , le code fonctionne correctement
    Peut-on voir le code que nous avons aidé à produire ?
    Kropernic

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

Discussions similaires

  1. [AC-2003] Ajouter un élément dans une liste depuis un autre formulaire
    Par fonfek24 dans le forum IHM
    Réponses: 5
    Dernier message: 04/07/2011, 15h35
  2. Ajout Dans une base de données
    Par belabyad dans le forum ASP
    Réponses: 8
    Dernier message: 11/03/2005, 13h25
  3. pb d'ajout dans une base de donnée
    Par loic.440 dans le forum ASP
    Réponses: 15
    Dernier message: 17/01/2005, 10h06
  4. Ajout dans une base
    Par semaj_james dans le forum Bases de données
    Réponses: 3
    Dernier message: 01/06/2004, 16h23
  5. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28

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