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 :

[4.0] GetNullableString méthode d'extension qui accepte le nom du champ


Sujet :

C#

  1. #1
    CUCARACHA
    Invité(e)
    Par défaut [4.0] GetNullableString méthode d'extension qui accepte le nom du champ
    Salut,

    J'essaye d'utiliser la méthode d'extension GetNullableString pour remplir un Nullable<string> et ça me pose 2 problèmes.

    Accessoirement, j'aimerais comprendre pourquoi string pose autant de problème lorsqu'on veut le manipuler en nullable.

    J'aimerais avoir une méthode d'extension
    Nullable<string> IDataReader.GetNullableString(string name,Nullable<string> defaultValue).

    un truc comme ça mais ça ne fonctionne pas... :'(
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            private static class MyExtension
            {
                public static Nullable<string> GetNullableString(IDataReader reader, string name,Nullable<string> defaultValue)
                {
                    if (reader[name] == DBNull.Value) return defaultValue;
                    return (Nullable<string>)(reader[name].ToString());
                }
            }
    Un peu d'aide serait la bienvenue...

    ++

    Laurent

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par Laurent Jordi Voir le message
    Accessoirement, j'aimerais comprendre pourquoi string pose autant de problème lorsqu'on veut le manipuler en nullable.
    Parce que String est une classe, donc un type référence, donc nullable par défaut. Nullable<T> n'est valide que pour les structures (il suffit de regarder la contrainte de type dans la déclaration).

    Enlève le Nullable<String> et utilise juste String.
    Pas de questions techniques par MP

  3. #3
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Nullable<> n'est pas fait pour les String, c'est pour ça que ça pose des problèmes à mon avis.
    String, contrairement à des Double ou des Int32, DateTime, peut contenir la valeur null car c'est une référence, donc il n'y a pas à préciser un caractère "nullable", c'est implicite.

    Quel est ton besoin d'utilisation de cette collection ?

    EDIT : Grillé...
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  4. #4
    CUCARACHA
    Invité(e)
    Par défaut
    En fait, je voulais utiliser les méthodes d'extension de IDataReader GetNullableXXX
    Le souci, c'est que contrairement au GetXXX on ne peut pas spécifier le nom du membre et ça pose un problème car je n'ai pas la garantie qu'un développeur qui n'aime pas le classement de mes champs ne réorganise pas ces derniers dans la proc.

    ++

    Laurent

  5. #5
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Dans ce cas qu'est-ce qui t'empêche d'utiliser une collection classique ?
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  6. #6
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Pour info, il y a des méthodes d'extension qui font ce genre de choses (GetXXX par nom du champ) dans la lib Dvp.NET
    Pour les champs qui peuvent être null, ce n'est pas directement géré mais il y a des méthodes GetXXXOrDefault qui permettent de spécifier une valeur par défaut, et une méthode Field<T> qui permet de spécifier un type nullable (genre int? x = reader.Field<int?>("ParentId");)

    Dans ton cas il me semble que celle qui pourrait te servir est GetStringOrDefault

  7. #7
    CUCARACHA
    Invité(e)
    Par défaut
    En fait, mes coéquipiers ont utilisé une technique que je considère comme très élégante.

    Ils créent une classe privée anonyme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var m = new {
        nomChamp0 = 0;
        nomChamp1 = 1;
        nomChamp2 = 2;
    }
    Ensuite c'est Champ2 = reader.GetNullableString(m.nomChamp2,"default value");
    Laurent
    Dernière modification par Deepin ; 03/06/2011 à 17h56.

  8. #8
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Laurent Jordi Voir le message
    En fait, mes coéquipiers ont utilisé une technique que je considère comme très élégante.
    Euh... question de point de vue je suppose, mais moi je trouve ça affreux. Si tu modifies un peu la requête en changeant l'ordre des champs, et que tu oublies de modifier le type anonyme, ça marche plus. Surtout que c'est super simple de gérer ça directement avec le nom... si tu as une méthode d'extension comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static string GetNullableString(this IDbDataReader reader, int columnIndex, string defaultValue)
    {
        ...
    }
    Tu peux facilement en créer une qui accepte le nom de la colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static string GetNullableString(this IDbDataReader reader, string columnName, string defaultValue)
    {
        int columnIndex = reader.GetOrdinal(columnName);
        return reader.GetNullableString(columnIndex, defaultValue);
    }

  9. #9
    CUCARACHA
    Invité(e)
    Par défaut
    Je suis d'accord avec toi mais le concepteur a pondu ça il parait que ça serait plus performant.

  10. #10
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Laurent Jordi Voir le message
    Je suis d'accord avec toi mais le concepteur a pondu ça il parait que ça serait plus performant.
    Sans doute un peu plus performant, vu que ça évite l'appel à GetOrdinal, mais à mon avis ça relève de la micro-optimisation... Et question lisibilité et maintenabilité, c'est vraiment pas terrible.

  11. #11
    CUCARACHA
    Invité(e)
    Par défaut
    Je suis d'accord... Plus jeune j'aurais éventré le chef de projet pour ça... Maintenant que j'ai acquis un peu plus de sagesse, je ne vas pas le froisser...

  12. #12
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    en tant qu'architecte, tu peux peut-être argumenter sur la lisibilité et la maintenabilité... parce qu'avec leur code, sans commentaire pour aider. dans 1 an ça va être difficile à comprendre.
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

  13. #13
    CUCARACHA
    Invité(e)
    Par défaut
    Je suis senior développer sur ce coup, pas architecte. En plus ça fait pas longtemps que je suis là... Je préfère garder mes cartouches pour la V2...
    Dans une mission antérieure, j'étais archi et un développeur m'a fait ça, je n'ai pas apprécié. Chacun son rôle...

Discussions similaires

  1. masqué la barre qui contient les nom des champs dans dbgrid
    Par kroma23 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 09/09/2008, 12h57
  2. Existe-t-il des forums qui acceptent la syntaxe LaTeX ?
    Par roger12 dans le forum Editeurs / Outils
    Réponses: 2
    Dernier message: 15/12/2006, 22h11
  3. Réponses: 2
    Dernier message: 07/11/2006, 09h15
  4. Réponses: 5
    Dernier message: 09/05/2006, 13h27
  5. un input qui accepte que les chiffres ?
    Par VerrNum dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/03/2006, 13h28

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