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 :

reinitialiser les instances de classe


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut reinitialiser les instances de classe
    Bonjour,

    J'utilise une bibliothèque de classes définies par mes soins pour faire tourner mon programme, dans chacune de ces classes métiers se trouve une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shared cnx = AccesBase.getConnection
    .

    Le souci que j'ai c'est que cette variable peut prendre 2 valeurs qui représentent les connectionString de 2 bases (la base de test et la base de prod), donc lorsque je fais "Déconnecter" sur mon appli et que je reviens sur l'écran de log, il faudrait que je puisse "killer" ces variables cnx ou invalider les instances de mes classes métier.

    P.S: J'ai également essayer deplacer cette variable cnx sur My.Settings mais le problème reste le même, une fois mes classes instanciées je n'arrive plus à leur mettre une nouvelle valeur de connexion.

    Merci d'avance.

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut
    Salut,

    A mon humble avis, tu ne prends pas le problème comme il le faut.

    Ce qui serait le plus simple pour toi, ce serait d'avoir une classe avec les deux chaines de connections.

    Tu crée une énumération (enum) pour définir deux "constantes" qui distingueront tes chaines.

    Tu définis tes méthodes en Shared, comme ça, tu n'instancies pas ton objet.

    Il te reste à faire

    MaClasse.MaMethode(ma_base_de_donnee, ma_requete)

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    Et bien c'est déjà ce que j'ai fait, accesBase est une classe contenant une méthode getConnection qui elle même se réfère à My.Settings pour savoir à quelle chaîne de connection faire appel (My.Settings défini cette chaîne lors du log de l'utilisateur sur l'appli).

    Ensuite lors des appels à mes classes métiers, elles s'instancient avec la chaîne "en cours", ce que je voudrais c'est changer la valeur de cette variable, en gros faire un test lors d'un appel pour savoir si la valeur est toujours la bonne.

    Je crois que le plus simple c'est que lors de la déconnexion, il faudrait que je kill toutes les instances de mon programmes en cours, j'ai cherché dans le namespace "My" mais je n'ai pas trouvé mon bonheur,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    My.Application.ApplicationContext.ExitThread
    est un peu trop radical

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    Bon, j'ai essayé ça:

    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
    Private Sub BtDeconnecter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtDeconnecter.Click
            My.Settings.UserEnCours = Nothing
            My.Settings.Test = Nothing
            Dim listForm As New List(Of Form)
            For Each f As Form In My.Application.OpenForms
                If f.Name Is "Login" Then
                    Continue For
                Else
                    listForm.Add(f)
                End If
            Next
            For Each f As Form In listForm
                My.Application.OpenForms.Item(f.Name).Dispose()
            Next
            Dim panoLogin As Windows.Forms.Form = New Login
            Me.Hide()
            panoLogin.Show()
        End Sub
    mais toujours pas plus de succès...

    Vraiment si quelqu'un pouvait m'indiquer la marche à suivre ça serait super sympa, parce que là je n'ai plus beaucoup de cheveux à force de les arracher

    Je suis quasiment sûr que la solution réside dans le namespace "My" mais je ne trouve pas...

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut
    Vraiment, je pense que tu as un souci de conception.

    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
    Public Class MaClasseSQL
    		Public Enum eTypeConnexion
    				prod
    				dev
    		End Enum
     
    		Private _tpCnx as eTypeConnexion
    		private _strCnx as String
     
     
    		Public Sub New(i_typecnx as eTypeConnexion)
    			_tpCnx = i_typecnx
    			me.Init()
    		End Sub
     
    		Private Sub Init()
     
    				Select Case _tpCnx
     
    						Case prod
    							'ici tu charges la chaine de connexion prod + instanciation de ta variable de con
    							_strCnx = "chainedeconnexion;prod"
     
    						Case dev
    							_strCnx = "chainedeconnexion;dev"
     
    						Case Else
     
    				End Select
     
    				TaVariableDeConnexion.ConnectionString = _strCnx
     
    		End Sub
     
     
    		'....
    End Class
    Voilà comment tu pourrais structurer ta classe d'accès aux données.

    Quand tu crées ta classe d'accès aux données, tu indiques dans quel cas tu te trouves ... Ou tu peux même gérer ça avec un booléen dans ton cas "True = prod / False = dev"

    A toi de voir après, comment dans ton appli, tu switch le mode prod/dev...

    Dans tes paramètres (my.settings) tu crées donc deux variables !

    CNXSTR_PROD
    CNXSTR_DEV

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    Oui c'est à peu près ce que j'ai fait au final:

    au login :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If CbTest.Checked Then
                My.Settings.connect = "maChaîneDeTest"
            Else
                My.Settings.connect = "maChaînedeProd"
            End If
    et dans la classe d'accès au données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Class AccesBase
     
            ''' <summary>
            ''' Retourne la sqlConnection à utiliser
            ''' </summary>
            ''' <returns>SqlConnection</returns>
            ''' <remarks>la chaîne de connection est différente en cas de connexion à la base test ou prod</remarks>
            Public Shared Function getConnection() As SqlClient.SqlConnection
                Dim cnx As New SqlClient.SqlConnection
                cnx.ConnectionString = My.Settings.connect
                Return cnx
            End Function
     
        End Class
    Ce qui me gêne, c'est que je faisais déjà à peu près ça avant, puis je me suis dit qu'à chaque fois que j'appelais mes classes métier j'instanciait une nouvelle chaîne de connexion, mais en la placant dans My.Settings le problème est résolu non? C'est bien toujours le même objet qui est appelé? C'est même du coup le même objet pour toute les classes (si j'ai bien compris les settings)?

    EDIT : Ou alors il faudrait que je fasse une autre fonction (closeConnection par exemple) qui ferait un Dispose() sur le cnx?

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 24/08/2007, 10h57
  2. comment trier les instances d'une classe selon un attribut choisi
    Par rddev dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 29/05/2007, 00h01
  3. Accéder à toutes les instances d'une classe
    Par MrGecko dans le forum Delphi
    Réponses: 15
    Dernier message: 14/05/2007, 00h50
  4. Réponses: 5
    Dernier message: 13/07/2006, 09h44
  5. Connaitre toutes les instances d'une classe
    Par miniseb dans le forum Langage
    Réponses: 14
    Dernier message: 09/01/2006, 17h35

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