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 :

Conventions d'écriture dans un programme en VB avec une base de données


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Par défaut Conventions d'écriture dans un programme en VB avec une base de données
    Bonjour à tous et toutes,

    Je m'interroge sur deux points de programmation dans mon projet que j'essaye de developer dans Visual studio en VB.

    Premièrement :
    Lorsque que je passe une commande sql dans mon code pour ajouter des donnes via des TextBox du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Table (colonne1, colonne2) VALUES ('"+Textbox1.Text+"','"+Textbox2.Text+"');
    Vaux-t-il mieux écrire '"+Textbox1.Text+"' ou '"&Textbox1.Text&"' ?

    Deuxièmement :
    Au chargement de mon form principal j'initialise ma connexion pour alimenter deux Listviews. Vaut-il mieux faire une procédure pour ouvrir la connexion ou retaper le code au besoin? Et du coups vaut-il mieux laisser la connexion ouverte pendant toute la durée de l'utilisation du programme ou la fermée des que possible ?

    Actuellement, j'ouvre ma connexion au chargement puis la ferme. Sur mon bouton d'ajout de données je l'ouvre à nouveau passe ma commande sql puis la referme ect...

    Y a-t-il des conventions, ou bien juste des conseils pour optimiser mon code?

    Merci par avance pour vos précieux éclaircissements.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    en vb l'opérateur de concaténation est &, mais ils sont pas embêtants le + fonctionne aussi, donc tu choisis ...

    après pour les dates et les string il est fortement conseillé d'utiliser les dbparameters

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lecmd.commandtext = "insert into table (col1, col2) values (1,@texte)"
    lecmd.parameters.Add("@texte",varchar).value = me.textbox1.Text
    pour les string ca évite l'injection sql (faille de sécurité) et les problèmes avec un apostrophe dans le textbox (qui fermerait la chaine et le reste ne serait pas reconnu => bug)
    pour les dates ca évite une conversion en texte puis une reconversion en date côté base de données, qui pourrait en plus entrainer une inversion mois/jour

    concernant l'ouverture/fermeture de connexion il est conseillé de l'ouvrir quand on en a besoin et de la fermer dès qu'on a fini, donc d'en ouvrir souvent (parfois plusieurs en même temps avec du multithreading)

    le mieux reste de se faire une classe qui encapsule l'accès aux données pour au final n'écrire que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DB.Execute(unstring)
    ou données = DB.Read(unstring) ' soit une fonction qui te retourne les données dans une variable, ou éventuellement une fonction qui te retourne le DbDataReader pour faire la boucle dans le code
    avec des signatures dans le genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function Execute(requete as string, paramarray parameters() as system.data.sqlclient.sqlparameter ' pour sql server
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Par défaut
    Merci beaucoup Pol63 pour ces réponses à la fois précises et argumentées. Je vais de ce pas appliquer tes conseils.

    Merci encore du temps que tu m'as consacré.

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

    Pour des exemples de 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.

  5. #5
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Par défaut
    Bonjour rv26t,

    excellent ce lien sur les requêtes et j'avoue que cette notion de vulnérabilité par injection m'était complètement étrangère. C'est vraiment ce qui me passionne dans mon apprentissage c'est que, pour pratiquement à chaque ligne de code, cela appel une remise en question de mes certitudes et la nécessite d’acquérir une nouvelle notion. Merci encore pour vos réponses car cela va ouvrir sur l'approfondissement de la notion d'encapsulation, de classe et de requête paramétrée.

  6. #6
    Membre émérite
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Par défaut
    Bonjour,
    Pour aller un peu plus loin sur le fonctionnement d'ADO.Net et, un article MSDN qui explique ce qui se passe lorsque l'on ferme une connexion à SQL Server :
    Regroupement de connexions SQL Server (ADO.NET)

  7. #7
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Par défaut
    Intéressant dkmix merci.

    Cependant, donc mon cas il me semble (si j'ai bien compris les informations contenu dans ton lien) que cela ne s'applique pas à mon projet car j'ai une base de données unique donc une seule chaîne de connexion. Je me place tout de même c'est info dans mon document de recensement des infos utiles pour plus tard.

    Je suis actuellement en terrain de modifier mon code avec toutes ces infos et je vous soumettrais le avant/après si vous le voulez bien ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    le lien est pour sql server, si tu es sur une autre base de données le pooling n'est pas forcément inclus
    et ce n'est qu'un mécanisme interne qu'on peut oublier sur la plupart des applications, ca explique comment ca gagne du temps, mais il y a des tas de choses plus interressantes à apprendre sur .net avant ca

    sinon une seule chaine de connexion ne veut pas forcément dire une seule connexion, même sur access on peut ouvrir plusieurs connexions en même temps (depuis plusieurs poste ou pas, faire plusieurs choses à la fois est une étape importante de nos jours, car il y a plusieurs coeurs sur les processeurs, pas forcément utile sur une petite application)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Par défaut
    Bonjour,

    j'ai bien avancé il me semble sur la base de vos conseils (je suis en train de finaliser ma compréhension des requêtes paramétrées. Ce sera donc la prochaine étape d'évolution de mon code).

    J'ai donc créé une classe qui gère ma connexion à ma base ainsi que mes requêtes.
    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
    Imports System.Data.Sql
    Imports System.Data.SqlClient
     
    Public Class ConnectBDD
     
        Public CnBD As New SqlConnection With {.ConnectionString = "Data Source=(LocalDB)\v11.0;AttachDbFilename=" & Application.StartupPath & "\Database.mdf;Integrated Security=True"}
        Public CmBD As SqlCommand
     
        Public Function TestCnBD() As Boolean
            Try
                CnBD.Open()
                CnBD.Close()
                Return True
            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            End Try
        End Function
     
        Public Sub RunRqt(Rqt As String)
            Try
                CnBD.Open()
                CmBD = New SqlCommand(Rqt, CnBD)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub
    End Class
    Puis j'utilise cette classe dans mon form au besoin.

    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
    Imports System.Data.Sql
    Imports System.Data.SqlClient
     
     
    Public Class Form1
        Dim sql As New ConnectBDD
        Dim dr As SqlDataReader
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            RemplirLVenfants()
            RemplirLVparents()
        End Sub
        Private Sub RemplirLVenfants()
            If sql.TestCnBD = True Then
                sql.RunRqt("SELECT * FROM enfants")
                dr = sql.CmBD.ExecuteReader
                dr.Read()
                Dim item As ListViewItem
                Do
                    item = New ListViewItem
                    item.Text = dr("Id").ToString()
                    item.SubItems.Add(dr("nom").ToString())
                    Lv_enfants.Items.Add(item)
                Loop While (dr.Read())
                dr.Close()
                sql.CnBD.Close()
            End If
        End Sub
        Private Sub RemplirLVparents()
            If sql.TestCnBD = True Then
                sql.RunRqt("SELECT * FROM parents")
                dr = sql.CmBD.ExecuteReader
                dr.Read()
                Dim item As ListViewItem
                Do
                    item = New ListViewItem
                    item.Text = dr("Id").ToString()
                    item.SubItems.Add(dr("monpere").ToString())
                    item.SubItems.Add(dr("prenompere").ToString())
                    item.SubItems.Add(dr("enfantID").ToString())
                    Lv_parents.Items.Add(item)
                Loop While (dr.Read())
                dr.Close()
                sql.CnBD.Close()
            End If
        End Sub
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Ajoutenfants()
            Ajoutparents()
            RemplirLVenfants()
            RemplirLVparents()
            MsgBox("Les informations ont bien été enregistrées")
        End Sub
        Private Sub Ajoutenfants()
            If sql.TestCnBD = True Then
                sql.RunRqt("INSERT into enfants values('" + TextBox2.Text + "')")
                sql.CmBD.ExecuteNonQuery()
                sql.CnBD.Close()
            End If
        End Sub
        Private Sub Ajoutparents()
            If sql.TestCnBD = True Then
                sql.RunRqt("INSERT into parents (monpere,prenompere,enfantID) values ('" + TextBox1.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "')")
                sql.CmBD.ExecuteNonQuery()
                sql.CnBD.Close()
            End If
        End Sub
    End Class
    Selon vous, suis-je plus dans les conventions ou standard de conception de Visual ?

    J'ai eu pas mal de mal au début à comprendre comment interagir entre ma classe et mon form. Mais une fois ConnectBDD instancier dans mon form et une fois que mon petit cerveau avait réussit à comprendre que j'avais du coups accès à chaque attribut de ma classe par ce biais c'est devenu beaucoup plus simple. Par contre, j'ai encore beaucoup de mal à faire le lien entre la notion de requête paramétrée (que je crois comprendre d'une par) et l’intégration dans ma class ConnectBDD.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    ca ne va pas assez loin dans l'encapsulation
    quand je trouve le temps je te mets une classe et/ou une explication de pourquoi et comment encapsuler ca
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [AJAX] boucle for dans item pour l'affichage d'une base de donné
    Par senda dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/03/2009, 14h42
  2. Réponses: 4
    Dernier message: 07/01/2009, 11h09
  3. Réponses: 5
    Dernier message: 01/10/2007, 14h05
  4. Comment on connecte un programme Java avec une base de données FireBird?
    Par Gomez dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 16/02/2007, 11h21
  5. Réponses: 4
    Dernier message: 19/10/2006, 18h19

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