8
votes

Y a-t-il une meilleure façon de faire cela: convert.isdbnull (ligne [Somécolumn]) Vérification

Y a-t-il un meilleur moyen d'écrire ce code ..

MyObject pymt = new MyObject();
pymt.xcol1id= Convert.IsDBNull(row["col1id"]) ? 0 : (int)row["col1id"];
pymt.xcold2id= Convert.IsDBNull(row["col2id"]) ? String.Empty : (string)row["col2id"];
pymt.xcold3id = Convert.IsDBNull(row["CustNum"]) ? 0 : (decimal)row["xcold3id"];


7 Réponses :


2
votes
 static ToType GenericConvert<ToType>(object value)
        {
            ToType convValue = default(ToType);

            if (!Convert.IsDBNull(value))
                convValue = (ToType)value;

            return convValue;
        }


MyObject pymt = new MyObject();
pymt.xcol1id= GenericConvert<int>(row["col1id"]);
pymt.xcold2id= GenericConvert<string>(row["col2id"]) ?? String.Empty;
pymt.xcold3id = GenericConvert<decimal>(row["CustNum"]);

0 commentaires

1
votes

J'aimerais vraiment ça. Notre équipe utilisait des déclarations si / sinon plus difficiles à lire à mon avis.

if (row["col1id"] == dbnull.value)
   pymt.xcol1id = 0;
else
   pymt.xcol1id = (int)row["col1id"];


0 commentaires

11
votes

Vous pouvez faire des méthodes d'extension génériques telles que ceci: xxx

utilisation: xxx


2 commentaires

+1 Votre implémentation est meilleure que la mienne, je m'adresse à la mine pour corriger ce que vous avez mentionné. Mais maintenant ça a l'air sale :(


J'ai décidé d'utiliser cette approche car j'utilise VS2005, version 2.0. Merci à tous pour votre contribution, j'apprécie beaucoup ...



7
votes

J'ai tendance à utiliser l'opérateur de coalescence nul dans des situations comme celles-ci. En outre, dbnull.tostring renvoie String.empty, de sorte que vous n'ayez pas à faire quelque chose d'envie là-bas.

MyObject pymt = new MyObject();
pymt.xcol1id= row["col1id"] as int? ?? 0;
pymt.xcold2id= row["col2id"].ToString();
pymt.xcold3id = row["CustNum"] as decimal? ?? 0;


4 commentaires

+1 J'allais écrire ceci initialement, mais j'ai décidé d'écrire un convertisseur générique.


Cela ne fonctionnera pas si la propriété que vous définissez est un int et non un int? est-ce que cela va?


Ce sera, parce que le compilateur se rend compte qu'il n'ya aucun moyen qu'un null soit défini.


Bien que cela fonctionne, je soupçonne que les méthodes fournies dans System.Data.DataSetExtensions.dll sont plus efficaces, car le réflecteur me montre un peu de code visant efficacement les types de valeur de boxe efficaces dans cet ensemble. Pour être juste, je n'ai géré aucun point de repère pour comparer les deux approches.




3
votes

Mieux encore, ajoutez-le comme une méthode d'extension au datarow : xxx

Vous pouvez l'utiliser comme: xxx


1 commentaires

Bon point. Votre réponse est plus complète, meilleure pour vérifier votre réponse que pour ajouter davantage au bruit.