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

C# Discussion :

Connexion SQL globale


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Par défaut Connexion SQL globale
    Bonjour,
    Voila j'ai un petit soucis. J'aimerais créer une connexion (à SQL server) globale à tout le programme.
    J'ai ma connexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SqlConnection oConnexionMaBase = new SqlConnection(Ma chaine de connexion);
    oConnexionMaBase.Open();
    Je ne vois pas où l'initialiser pour qu'elle soit acccessible partout dans le programme
    Merci bp d'avance pour votre aide.
    Cédric

  2. #2
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Bonsoir,

    Ce n'est pas vraiment recommandé pour une question de performance, et je te le déconseille fortement.

    Mais sinon, c'est quoi comme type de programme ? Winforms, ASP. Net, autre ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Cedric33 Voir le message
    Je ne vois pas où l'initialiser pour qu'elle soit acccessible partout dans le programme
    Tu peux la déclarer comme membre statique d'une classe, et l'initialiser dans le constructeur statique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class UneClasse
    {
        public static SqlConnection oConnexionMaBase;
     
        static UneClasse()
        {
            oConnexionMaBase.Open();
        }
    }
    Mais à mon avis ce n'est pas vraiment nécessaire d'avoir une connexion accessible globalement : en effet, les connexions aux bases utilisent le pooling (à moins que tu ne le désactives explicitement dans la connection string). C'est à dire qu'un certain nombre de connexions ouvertes sont conservées dans un "pool" pour être réutilisées ultérieurement, même lorsque tu appelles Close dessus. Lorsque tu ouvres une nouvelle connexion avec la même chaine de connexion et qu'une connexion du pool est disponible, elle est réutilisée. Donc le fait de créer une nouvelle SqlConnection et d'appeler Open dessus ne causera pas réellement l'établissement d'une nouvelle connexion au serveur, ce qui évite de se préoccuper du nombre de connexions ouvertes.

    Citation Envoyé par Paul Musso Voir le message
    Ce n'est pas vraiment recommandé pour une question de performance, et je te le déconseille fortement.
    Pourquoi ça ? Je ne vois pas le rapport avec les performances... peux-tu développer ?

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Le problème de perf vient du fait que pour être thread-safe, l'accès à la connexion doit être protégé, ce qui fait que tu ne peux jamais avoir plus d'une connexion à la base en même temps. En plus, si jamais, tu prends l'habitude de faire ça en winforms, imagine ce qui va se passer le jour où tu passeras en ASP.NET : tu n'auras qu'une connexion pour tous les utilisateurs en même temps !
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Par défaut
    Merci pour vos réponses.
    C'est pour une appli Winforms. En fait je voulais créer une connexion globale afin de savoir à tout moment qui est connexion (acces concurrents).

  6. #6
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Pour savoir le nombre de connexions, tu peux mettre en place un compteur statique et protégé, et pour empécher que 2 personnes réalisent une action quelconque sur la base en même temps, tu peux utiliser un bon vieux lock (pas forcément très performant par contre, ca dépend surtout du nombre d'utilisateurs moyen).

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Par défaut
    Le problème du compteur c'est comment tu fais s'il une connexion est coupée réseau? Ton compteur t'indique que x utilisateurs sont connectés alors qu'il y en a x-1.
    Pour le lock, si je ne dis pas de bétises, tu peux locker une table mais pas une ligne de la table, non? Par ce que si une personne modifie un enregistrement il n'y a pas de raison qu'une autre personne ne puisse pas modifier un autre enregistrement de la table.
    Cédric

  8. #8
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Pour le compteur, il faut bien sûr que tu le mette à jour. C'est à dire que lorsque tu ouvre une connection, que tu la ferme ou que celle-ci génère une exception, il faut faire un cpt += 1 ou cpt-=1.

    Quand je parle de lock, c'est pas au niveau de la base de données, mais au niveau du code.
    Dès que tu fait une opération sur la base, tu la fait dans un lock et avec la même variable partagée. Comme je dis plus haut, c'est pas performant, mais c'est une solution radicale contre l'accès conccurentiel. D'ailleurs je ferais jamais un truc pareil ^^

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Par défaut
    J'ai bien compris pour le -=1 ou le += 1. Mais par exemple : un utilisateur se connecte donc on fait une += 1. Celui-ci a une coupure réseau, donc on ne peut pas faire de -=1. Je me connecte et d'après le compteur interrogé, je crois qu'il y a toujours un utilisateur de connecté. P'etre que j'ai pas compris sinon

  10. #10
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Si tu as une coupure réseau lorsqu'une tu as une connection ouverte alors la prochaine opération vers la base de données va à coup sur générer une exception. Dans le block catch, tu teste le type d'exception (celle qui correspond à un problême de connexion) et en fonction tu fait un cpt -= 1.

    Comme cela, ton compteur sera représentatif de la réalité.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Par défaut
    Je croyais que le compteur se trouvait dans la base de données (une table compteur par exemple). Là j'avoue que je ne vois pas où se situe ce compteur pour que tout le monde y est acces même la personne qui a eu la coupure réseau.
    Cédric, perdu

  12. #12
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Tout simplement dans le code de ton application, en variable statique par exemple.

    Voici un petit exemple from scratch :

    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
    public class Programme
    {
        private volatile static int cptConnexions = 0;
        private volatile static object _lock = new Object();
     
        public static int CptConnexions
        {
            get
            {
                return cptConnexions;
            }
            set
            {
                lock (_lock)
                {
                    cptConnexions = value;
                }
            }
        }
     
        private void OperationSurLaBase()
        {
            try
            {
                CptConnexions += 1;
            }
            finally
            {
                CptConnexions -= 1;
            }
        }
    }
    D'ailleurs, t'as pas besoin de tester l'exception, le block finally est parfait pour mettre à jour le compteur.

    EDIT : Je me dis peut être que je n'ai pas forcément bien compris ta problématique ^^. J'espère que ma réponse t'aidera

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Par défaut
    Je ne vois pas où tous les utilisateurs peuvent accéder à cette variable. 2 utilisateurs se connectent (chacun lance l'exe), je ne vois pas comment ils peuvent accéder tous les 2 à une même variable. Si 2 exe lancés, chacun aura sa variable. Ou alors y'a une notion que je n'ai aps compris

  14. #14
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Oui tout à fait lol. J'ai zappé le moment ou tu parlais de Winforms.

    En cherchant un peu sur le net, j'ai trouvé un bout de code SQL qui récupère le nombre de connexion ouverte sur du SQL SERVEUR.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
    PROCESSLIST.status, PROCESSLIST.*
    FROM
    master.dbo.sysprocesses PROCESSLIST
    INNER JOIN master.dbo.sysdatabases DATABASELIST
    ON PROCESSLIST.dbid = DATABASELIST.dbid
    WHERE
    (DATABASELIST.name = N'TestTimeTable')

    En espérant que cela t'aide ^^

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Par défaut
    Ha ça me rassure alors lol
    Mais j'en reviens donc à ma question : si je ne passe pas par un connexion globale, ton code n'est pas valable.
    Et pour info, je dirais que je peux arriver a une dizaine de personnes connectées en même temps sur la base.

  16. #16
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Pas tout à fait. Si tu mets mon code dans un web service et que tes appli Winforms l'utilise, il est valable. Tu peux d'ailleurs utiliser n'importe quel type de service (TCP ou MSMQ par exemple).

    Dans tous les cas, avoir une connection globale n'est pas une bonne solution pour les raisons citées plus haut et comme tu le dis, tu vas surement rencontrer un problême s'il y a beaucoup d'applications clientes lancées en même temps.

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

Discussions similaires

  1. [C#] Problème de connexion sql server 2000
    Par rabbiwan dans le forum ASP.NET
    Réponses: 8
    Dernier message: 22/12/2004, 16h21
  2. [CE10 Pro] Erreur Connexion SQL pour etats publiés
    Par L.nico dans le forum Connectivité
    Réponses: 1
    Dernier message: 09/12/2004, 17h16
  3. Connexion à SQL Server avec ASP
    Par ayobo dans le forum ASP
    Réponses: 3
    Dernier message: 25/05/2004, 17h06
  4. Connexion SQL Server
    Par Bart51 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/05/2004, 10h49
  5. connexion sql serveur
    Par DiJiRiDouS dans le forum ASP
    Réponses: 10
    Dernier message: 16/09/2003, 16h14

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