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 :

Liste ou tableau de ManagementObject [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Par défaut Liste ou tableau de ManagementObject
    Bonjour, j'ai un petit problème.

    J'ai besoin de chercher le nom d'un ManagementObject dans deux classes : Win32_PnPEntity et Win32_USBHub. Il peut potentiellement être dans l'une ou dans l'autre.

    Pour le moment je procède de la manière qui suit :
    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
     
     
        string name = "";
     
                ManagementObjectSearcher searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity");
                foreach (ManagementObject mo2 in searcher2.Get())
                {
                    try
                    {
                        name = mo2["Name"].ToString();
                        if (name.Contains("USB Serial Port"))
                        {
                            //strReaderType = "Bixi";
                            return "Bixi";
                        }
                        else if (name.Contains("Kaba B-Net 91 07"))
                        {
                            //strReaderType = "Kaba";
                            return "Kaba";
                        }
     
                    }
                    catch(Exception ex)
                    {
                        LogWriter.WriteLog(ListMessages[5].Msg_Text1 + " " + System.Reflection.MethodBase.GetCurrentMethod().Name + " " + ex.Message);
                    }
                }
     
                ManagementObjectSearcher searcher3 = new ManagementObjectSearcher("SELECT * FROM Win32_USBHub");
                foreach (ManagementObject mo2 in searcher3.Get())
                {
                    try
                    {
                        name = mo2["Name"].ToString();
                        if (name.Contains("USB Serial Port"))
                        {
                            //strReaderType = "Bixi";
                            return "Bixi";
                        }
                        else if (name.Contains("Kaba B-Net 91 07"))
                        {
                            //strReaderType = "Kaba";
                            return "Kaba";
                        }
     
                    }
                    catch (Exception ex)
                    {
                        LogWriter.WriteLog(ListMessages[5].Msg_Text1 + " " + System.Reflection.MethodBase.GetCurrentMethod().Name + " " + ex.Message);
                    }
                }
     
                return "Erreur";
    Seulement c'est pas très propre, je répète pas mal de code bêtement, 2 fois.

    J'ai donc pensé à deux solutions :

    1 : Modifier la requête SELCT * FROM Win32_PnPEntity en la faisant aller chercher dans les deux classes directement (malheureusement impossible je crois)
    2 : Créer un tableau ou une liste de ManagementObject, unifier les deux en une seule et aller la parcourir.

    Je peux coder comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         ManagementObjectSearcher mos1 = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity");
                ManagementObjectSearcher mos2 = new ManagementObjectSearcher("SELECT * FROM Win32_USBHub");
                ManagementObjectCollection moc = mos1.Get();
                moc = mos2.Get();
    Cependant les objets de la mos1.Get() ne seront pas sauvegardés, ils seront écrasés par la mos2.Get()

    avez-vous une solution à me proposer ?

    Thx.

  2. #2
    Membre émérite Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Par défaut
    Salut,

    Citation Envoyé par steve15 Voir le message
    J'ai donc pensé à deux solutions :

    1 : Modifier la requête SELECT * FROM Win32_PnPEntity en la faisant aller chercher dans les deux classes directement (malheureusement impossible je crois)
    2 : Créer un tableau ou une liste de ManagementObject, unifier les deux en une seule et aller la parcourir.
    En fait je pense que tes deux solutions n'en forme qu'une seule. Visiblement tes deux tables contiennent pas mal de propriétés en commun.

    Est ce que cela serait jouable de faire une union de ces deux tables dans ta requête SQL ?

    Cela te donnerait quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM Win32_PnPEntity
    UNION
    SELECT * FROM Win32_USBHub
    Note que l'union te virera automatiquement les doublons (dans le cas d'un select *, il s'agira des enregistrements ayant toutes leurs colonnes identiques).

    Tu obtiendrais du coup une liste contenant les éléments de tes deux tables.

  3. #3
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    @Momoth : les union ne sont pas autorisées, ça va lever une exception.
    De plus les deux classes n'ont pas tout à fait les mêmes attributs (là au pire il suffisait de définir les champs sélectionnés).

    @steve15 : factoriser pour factoriser, je suis pas sûr que ce soit la meilleure chose à faire.
    Si c'est juste pour économiser quelques lignes tu peux externaliser ton parcours dans une fonction.
    Les autres solutions seront contre-productives.

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Par défaut
    Merci pour les infos !

  5. #5
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Si tu veux tu peux faire une petite fonction qui prend une requête en param, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	private ManagementObject GimmeDatStuff(string query) {
    		ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
    		ManagementObjectCollection objs = searcher.Get();
    		if (objs.Count == 1) {
    			ManagementObjectEnumerator enu = objs.GetEnumerator();
    			enu.MoveNext();
    			return (ManagementObject)enu.Current;
    		} else return null;
    	}
     
    	// exemple d'appel
    	ManagementObject obj = GimmeDatStuff("select * from Win32_PnPEntity where Name = 'USB Serial Port'");
    La fonction qui fait les recherches sera alors un peu plus lisible (mais pas plus performante).

    Bonne continuation.

  6. #6
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Par défaut
    Tip top ! merc

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

Discussions similaires

  1. Transformer une liste en tableau
    Par basket dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/09/2006, 16h01
  2. [Tableaux] Liste et tableau de PHP
    Par jive dans le forum Langage
    Réponses: 1
    Dernier message: 03/09/2006, 15h01
  3. liste ou tableau ?
    Par CaptainChoc dans le forum Développement 2D, 3D et Jeux
    Réponses: 12
    Dernier message: 17/07/2006, 19h39
  4. difference entre vector, deque, list et tableau
    Par salseropom dans le forum SL & STL
    Réponses: 8
    Dernier message: 03/01/2005, 13h35
  5. [langage] random sur liste ou tableau
    Par martijan dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2003, 14h47

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