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 :

Connexion base de données avec singleton


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut Connexion base de données avec singleton
    Bonjour à tous,

    Je voudrais faire en sorte que mon application n'exécute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    New SqlConnection(connectString)
    qu'une seule fois.

    De ce fait, j'ai crée une classe LinkDataBase pour avoir qu'une seule connexion au serveur (singleton) :

    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
     
    Public Class LinkDataBase
     
        Private connectString As String = "..."
        Private Shared instance As LinkDataBase = Nothing
     
        Private Sub New()
     
            Dim connection As SqlConnection = New SqlConnection(connectString)
     
            connection.Open()
     
            If Not connection.State = ConnectionState.Open Then
                MsgBox("Server connection failure ", MsgBoxStyle.OkOnly, "Status")
            End If
     
        End Sub
     
     
        Public Shared Function GetInstance() As LinkDataBase
     
            If instance Is Nothing Then
                instance = New LinkDataBase()
            End If
     
            Return instance
     
        End Function
    End Class
    De ce côté la, pas de problème. Cependant, quand je veux faire une SqlCommand, le second paramètre doit être de type SqlConnection sauf que quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim insert As SqlCommand = New SqlCommand("INSERT INTO ..", LinkDataBase.GetInstance())
    il me dit qu'une valeur type LinkDataBase ne peut être convertie en SqlConnection (logique).

    Quelqu’un pourrait me dire comment palier ce problème ?

    Merci,

    Jah

  2. #2
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 330
    Points : 774
    Points
    774
    Par défaut
    Bonjour,

    Votre méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LinkDataBase.GetInstance()
    renvoie un objet LinkDataBase et pas une SqlConnection.

    Vous pouvez peut être ajouter une propriété à votre classe de type SqlConnection afin de pouvoir l'utiliser par la suite.

    Mais pourquoi vouloir monopoliser une connection à une source de données sur la durée de vie de l'application?

  3. #3
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    Bonjour Rainui,

    En fait, j'ai énormément de requêtes à faire dans différentes classes et je voulais mettre le getInstance dans chaque SqlCommand pour centraliser et simplifier la chose.

    Il faudrait donc que j'intègre un return quelque part ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 330
    Points : 774
    Points
    774
    Par défaut
    Bonjour,

    Vous pouvez plus simplement écrire une fonction à laquelle vous passez comme paramètre la requête que vous voulez exécuter et qui renvoie les résultats sous la forme que vous souhaitez utiliser.

    Ainsi vous n'aurez plus qu'à utiliser cette fonction pour récupérer vos données partout ou vous en avez besoin.

    Fonction du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Function ReturnData(ByVal CmdString As String) As DataTable
        Dim _Result As New DataTable
        Dim _ConnString As String = "Data Source=|DataDirectory|\MyDB.sdf;Persist Security Info=False;"
        Dim _Conn As New SqlServerCe.SqlCeConnection(_ConnString)
        Dim _Command As New SqlServerCe.SqlCeDataAdapter(CmdString, _Conn)
        _Conn.Open()
        _Command.Fill(_Result)
        _Conn.Close()
        Return _Result
    End Function

  5. #5
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    Merci pour vos réponses Rainui,

    Le problème c'est que ce sont des inserts, dans les classes où j'exécute les requêtes, je voudrais éviter d'avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim _ConnString As String = "Data Source=|DataDirectory|\MyDB.sdf;Persist Security Info=False;"
        Dim _Conn As New SqlServerCe.SqlCeConnection(_ConnString)
    De ce fait, j'ai voulu faire un singleton pour avoir à écrire ces lignes qu'une seule fois. De plus, je n'ai pas besoin de retour comme ce sont des Insert : ExecuteNonQuery()


    EDIT : Cette solution peut convenir mais je voudrais éviter de faire _Conn.Open() et _Conn.Close() à chaque requêtes

  6. #6
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 330
    Points : 774
    Points
    774
    Par défaut
    Bonjour,

    Heu, l'idée reste la même, je ne vois pas ce qui vous dérange

    Au lieu de faire une fonction vous faites une Sub, à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim _Command As New SqlServerCe.SqlCeDataAdapter(CmdString, _Conn)
    vous mettez un SqlServerCE.SqlCommand() puis à la place de vous mettez _Command.ExecuteNonQuery()

    Je ne vais pas vous pondre le code exact, je ne sais pas ce que vous voulez faire

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    La 1ère première chose quand on veut faire des choses étranges c'est de préciser pourquoi.

    Donc pourquoi ne vouloir qu'une connexion alors que tu as plein de requêtes à faire ?
    Ca irait beaucoup plus vite de les faire toutes en même temps.
    Et même si tu en fait une de temps en temps ouvrir et fermer une connexion à chaque fois et ce qui est recommandé.

    Néanmoins il convient de se faire une classe qui encapsule l'accès aux données, permettant en une ligne d'exécuter une requête plutot que d'en mettre 10. Si tu as une bonne raison cette classe peut être faite pour n'avoir qu'une connexion.

  8. #8
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    Je pense avoir trouvé la solution, je m'explique ..

    Comme j'ai des requêtes diverses et variées dans différentes classes, je voulais avoir une seule connexion au serveur à l'ouverture de mon programme et me déconnecter à la fermeture. Du coup j'ai fais comme ca :

    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
    Public Class LinkDataBase
     
        Private connectString As String = "...."
        Private Shared instance As LinkDataBase = Nothing
        Private Shared connection As SqlConnection = Nothing
     
     
        Private Sub New()
     
            connection = New SqlConnection(connectString)
     
            connection.Open()
     
            If Not connection.State = ConnectionState.Open Then
                MsgBox("Server connection failure ", MsgBoxStyle.OkOnly, "Status")
            End If
     
        End Sub
     
        Public Shared Function GetInstance() As SqlConnection
     
            If instance Is Nothing Then
                instance = New LinkDataBase()
            End If
     
            Return connection
     
        End Function
    End Class

    De ce fait, quand j’exécute une requête, je n'ai plus qu'à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dim insert As SqlCommand = New SqlCommand("...", LinkDataBase.GetInstance())
    Et pour me déconnecter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LinkDataBase.GetInstance.Close()
    Est-ce une bonne méthode ?

  9. #9
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 330
    Points : 774
    Points
    774
    Par défaut
    Bonsoir,

    Pour le coup, je ne vois pas pourquoi se casser la tête à écrire une classe pour juste ouvrir et fermer une connection ...

    Autant mettre une variable SqlConnection en public dans la classe du formulaire principal et sur les évènements load et closing gérer l'ouverture et la fermeture de la connection.

    Je dois probablement dire une bétise...

    Si Pol63 voit une utilité à cette classe, je veux bien la connaitre comme ça je me coucherais moins bête

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    ca permet de ne pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    using connexion
     
    end using
    donc ca ne va pas très loin ^^

  11. #11
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 330
    Points : 774
    Points
    774
    Par défaut
    Merci Pol63 pour cette confirmation

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Garder une connexion ouverte tout du long de la vie de ton application est une erreur de design "standard". Ca bouffe des ressources dans le vide et pire encore ça peut bloquer toutes la base parce qu'on a laisser un LOCK trainer à un endroite.

    C'est pourquoi il est conseillé d'utiliser un bloc Using uneconnexion As New connexion() .... End Using pour utiliser une connexion (Garantie que la connexion est fermée à la sortie du bloc using même en cas d'exception.

    Il peut néanmoins être intéressant de faire ce que tu proposes pour obtenir une chaîne de connexion commune à l'application (surtout si cette dernière peut être variable (le changement des settings des chaînes de connexion en .Net est assez laborieux :-)

    Last but not Least, même si le singelton c'est super sur le papier et que ça fait bien de dire qu'on utilise des paterns de prog, il existe en vb.net des trucs qui s'appellent les modules qui font a peu près la même chose en beaucoup plus simple. Je vais me faire tapper dessus par les puristes de la prog objet sur ce coup...

  13. #13
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 330
    Points : 774
    Points
    774
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Using Massette
    doigts=TryCast(SinopoleHand,Doigt)
    End Using
    En tout cas, j'aurais compris à quoi sert Using

  14. #14
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 154
    Points : 167
    Points
    167
    Par défaut
    Merci pour vos explications, je vais abandonner ce singleton alors ..

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

Discussions similaires

  1. Connexion base de donnée avec un code C#
    Par yochima dans le forum C#
    Réponses: 12
    Dernier message: 20/05/2017, 19h12
  2. [Débutant] Connexion base de donnée avec silverlight
    Par jorrie dans le forum Silverlight
    Réponses: 7
    Dernier message: 05/11/2012, 09h49
  3. Réponses: 2
    Dernier message: 24/03/2010, 11h37
  4. connexion base de données avec wxwidgets
    Par Zavonen dans le forum wxWidgets
    Réponses: 7
    Dernier message: 17/09/2007, 07h15
  5. creer connexion base de donné avec dbedit eclipse
    Par youcef81 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 22/07/2006, 17h37

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