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 :

Problème de DBNull


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut Problème de DBNull


    J'ai un problème dans le traitement des valeurs de type DBNull. J'ai peux tester ce que je veux, rien n'y fait...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    w.InsertText("InfosNomAggloAss", IIf(Not _ds.V_INFOS_GENERALES.Item(0).NOM_AGGLO_ASS = "", _ds.V_INFOS_GENERALES.Item(0).NOM_AGGLO_ASS.ToString(), ""))
    ...
    w..InsertText("InfosNomAggloAss", IIf(Not _ds.V_INFOS_GENERALES.Item(0).IsNOM_AGGLO_ASSNull(), _ds.V_INFOS_GENERALES.Item(0).NOM_AGGLO_ASS.ToString(), ""))
    ...
    w.InsertText("InfosNomAggloAss", IIf(Not _ds.V_INFOS_GENERALES.Item(0).NOM_AGGLO_ASS Is DBNull.Value(), _ds.V_INFOS_GENERALES.Item(0).NOM_AGGLO_ASS.ToString(), ""))
    Y a-t-il une autre solution ? J'ai une quinzaine de lignes de ce genre à la suite et j'aimerais éviter de mettre un bloc Try pour chacune d'entre elles
    Le retour m'indique que mon champ est DBNull mais bon, c'est bien ce que je test quoi, c'est un peu débile leur histoire


    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Perso, j'ai aussi toutes les peines du monde à traiter les marqueurs NULL en .NET.

    Du coup, je m'arrange pour que mes requêtes ne renvoient JAMAIS de marqueurs NULL.

    Et alors tout est beaucoup plus simple

    Maintenant, je ne connais pas ton besoin ni ton process flow. Peut-être que ce n'est pas envisageable dans ton cas... (ce serait con )

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    Salut,

    A une epoque j'avais fait un helper qui faisait un try catch bien degueux pour mutualiser ce genre de chose. Cela prenait une lambada en parametre et un second parametre qui definissait la valeur en cas de catch (j'ai plus les sources).

    a l'utilisation ca donnait un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    w.InsertText("InfosNomAggloAss", _ds.V_INFOS_GENERALES.Item(0).EvaluateOr(i=>i.NOM_AGGLO_ASS.ToString(), "")

    De plus, je crois que tu le sais mais le IIF en vbnet execute les deux cotes du if, donc utilisation a proscrire.

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    Je ne comprends pas le problème, je dois passer à coté de quelques choses mais je ne vois pas l’intérêt d'entourer ces lignes d'un try/catch la partie de test sur le DBNull ne peut pas générer d'exception, c'est d'ailleurs à mon sens le but de ce test.
    En tout cas je n'ai jamais eu de problème avec les DBNull, après il est vrai que tous mes champs en base sont not null (sauf les blob) mais je tests les champs DBNull pour par exemple savoir si une jointure a échoué.

    Sinon pour info (et que mon poste apporte quelque chose ) il existe Convert.IsDBNull

    J@ck

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    @J@ckHerror:
    le premier probleme vient du fonctionnement de la methode IIf elle meme:
    Because the IIf function does not use short-circuit evaluation, it always evaluates all three of its arguments.
    cf:https://msdn.microsoft.com/en-us/lib...or=-2147217396

    donc meme si t'as tester le dbnull dans la premier partie du iif, eh bien ceci sera evalue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     _ds.V_INFOS_GENERALES.Item(0).NOM_AGGLO_ASS.ToString()
    Donc oui la methode IIf est une plaie de vbnet

    Ensuite le second 'probleme' vient de la verbosite du truc, c'est hyper penible a copier colle ce genre de ligne.

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Merci Mermich ,
    Je suis plus C# du coup les subtilités de IIf me sont inconnues, je pensais que le problème était sur la détection des champs DBNull.
    Sinon oui en effet c'est verbeux ... ! il faut tester tous les champs.

    Peux être qu'une méthode d’extension sur Object permettrait de rendre le test plus sexy. On passe en paramêtre la valeur par défaut si c'est DBNull.

    Quoique avec les type générique un truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            public static T GetValueOrDefaut<T>(this object me)
            {
                if (!Convert.IsDBNull(me))
                    return (T)me;
                else
                    return default(T);
            }
    devrait même être encore plus sexy
    Il faudra peut être renforcer les tests pour être sur que le transtypage ne plante pas, mais c'est déjà pas mal comme ça.

    Je vais le tester tiens ...

    J@ck.

    [EDIT] désolé c'est du c#
    le code VB equivalent doit pas être loin de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            <Extension()> 
    	Public Sub GetValueOrDefaut(Of T)(ByVal aObject As Object) As T
    		If not Convert.IsDBNull(aObject)
    			return  CType(aObject,T)
    		End If 
    			return CType(Nothing, T) 
    	End Sub

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Si tu concatène un chaine vide avec un chaine null tu as un chaine vide!
    "" + _ds.V_INFOS_GENERALES.Item(0).NOM_AGGLO_ASS.ToString()

Discussions similaires

  1. Problème de passage d'une valeur DBNull.value à un WebService
    Par feanor91 dans le forum Services Web
    Réponses: 4
    Dernier message: 19/03/2014, 15h39
  2. probléme de conversion d'un DBnull
    Par cyriane dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/06/2012, 13h19
  3. Problème avec test valeur DBNull
    Par Tankian dans le forum C#
    Réponses: 2
    Dernier message: 09/12/2010, 14h55
  4. problème de dbnull
    Par asprog dans le forum Windows Forms
    Réponses: 1
    Dernier message: 04/06/2009, 14h44
  5. Dataset et DateTime : problème de DBNull
    Par tatayet_le_felee dans le forum C#
    Réponses: 4
    Dernier message: 09/12/2008, 09h17

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