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 :

Choix du type pour la création d'un objet selon un critère


Sujet :

C#

  1. #1
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut Choix du type pour la création d'un objet selon un critère
    Bonjour

    je veux créer une connexion (cnx) vers une base de données, qui peut être SQL server, DB2 IBM (AS400) ou Oracle

    Pour connaître la base de données, je lis un paramètre : provider :

    Pour éviter toute complication, j'ai mis en commentaire le code des deux derniers pour me concentrer sur SQL Server.

    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
                // Choix du fournisseur d'accès
                int provider = (Convert.ToInt16(urlCpte))/10;
                var cnx;
                switch (provider)
                {
                    case 1:             // SQL Server
                        cnx = new SqlConnection();
                        break;
                    case 2:             // DB2 AS400
                        //cnx = new SqlConnection();
                        break;
                    case 3:             // ORACLE
                        //cnx = new SqlConnection();
                        break;
                }
                // Preparation
                
                var chaine = urlCpte;  
                cnx.ConnectionString = Convert.ToString(ConfigurationManager.ConnectionStrings[chaine]);
                DbDataReader dr;
                cnx.Open();
    ...
    cnx est instancié dans le switch et cnx n'est donc pas utilisable dans le code APRES LE SWITCH.
    Erreur de compilation


    Si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                // Choix du fournisseur d'accès
                int provider = (Convert.ToInt16(urlCpte))/10;
                var cnx = new SqlConnection();
                // Preparation
     
                var chaine = urlCpte;  
                cnx.ConnectionString = Convert.ToString(ConfigurationManager.ConnectionStrings[chaine]);
                DbDataReader dr;
                cnx.Open(); ...

    ça marche, mais je perd le choix de type d'objet en fonction du paramètre provider

    Question :
    Comment faire ce switch pour créer cnx en fonction de la base de données ?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,

    Vous êtes sur que provider contient 1 ?
    Visiblement urlCpte est un string ? Pourquoi ne pas vous baser la dessus plutôt que de le convertir en int ?



    Qu'elle est l'erreur de compilation ?

    A+

  3. #3
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut
    bonjour

    UrlCpte peut être "cnx10", "cnx11", "cnx20", "cnx22" ...

    En prenant la partie numérique de la chaine UrlCpte :

    Je veux récupérer 11/10 = 1 pour SQL server (idem avec cnx11 et cnx12)
    Je veux récupérer 20/10 = 2 pour DB2 ...
    et 33/10 = 3 pour Oracle, ...

    Au niveau de la ligne 3 :
    L'erreur à la compilation est :

    "implicitly typed local variable must be initialized"
    puis après, j'ai une erreur sur chaque ligne où il y a cnx, bien sûr ...

  4. #4
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut
    nouveau test :

    si je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                // Choix du fournisseur d'accès
                int provider = (Convert.ToInt16(urlCpte))/10;
                object cnx;
                switch (provider)
                {
    je n'ai plus que les messages d'erreur sur les cnx suivants, quand j'utilise la connexion en fait , avec cnx.open() par exemple ...
    Ce qui veut dire que le compilateur ne tient par compte de l'instanciation de l'objet dans le switch, comme si ce n'était as du "même niveau" ?

    Problème de portée de l'objet ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tout d'abord une petite astuce : dans visual studio, tu peux, pour n'importe quelle classe même celles de Microsoft, sélectionner le nom de la classe et faire clic droit puis choisir "voir la définition". Si tu avais fais cela avec "SqlConnection" tu te serais aperçu qu'elle hérite de "DbConnection". Il en est de même avec n'importe quel autre objet "OracleConnection" ou que sais-je encore...

    Alors, ta variable va dans un "DbConnection" au lieu d'un "object".

    D'autre part, pour un type de base de donnée qui n'est pas forcément identique, regarde des objets comme DbProviderFactories qui permet d'obtenir un type de base de donnée paramétrable, ce que tu cherches à faire en fait.

    Et pour finir, encore une fois, n'hésite pas à consulter de la documentation sur le B-A-BA de C# et de .NET en général, tu trouveras de la doc notamment sur "développez.NET" pour le B-A-BA.
    Et si tu as besoin d'aide pour les classes de Microsoft, la touche F1 et l'aide en ligne MSDN sont tes amis!

  6. #6
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut
    merci ... je plonge dans la doc ...

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Une petite remarque : sache que 99% du temps "var" est utilisé de façon abusive.
    Pratique avec le résultat d'un GroupBy, essentiel pour une instance de type anonyme, les deux quand tu fais du LINQ, mais c'est à peu près tout.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

Discussions similaires

  1. choix de type pour du texte
    Par yupa dans le forum Débuter
    Réponses: 2
    Dernier message: 21/02/2008, 21h35
  2. Choix d'un script de CMS en PHP pour la création d'un poste de travail
    Par nickoko dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 12/03/2007, 11h01
  3. Choix pour la création de notre propre "Collection"
    Par goomazio dans le forum Langage
    Réponses: 9
    Dernier message: 23/12/2006, 23h03
  4. Quel type de table choisir pour la création d'un forum
    Par Xunil dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 19/11/2006, 12h40
  5. Mysql : choix des types pour les champs entre :
    Par Thierry8 dans le forum Administration
    Réponses: 3
    Dernier message: 14/06/2006, 08h22

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