2016-05-13 7 views
1

J'utilise la ligne suivante pour convertir la valeur datarow en double.Analyse d'une valeur DBNULL en double

double.parse(Convert.ToString(datarow)); 

Si le datarow est DBNULL, je reçois l'exception suivante:

'double.Parse (Convert.ToString (données))' a lancé une exception de type 'System.FormatException'

Comment gérer celui-ci sans utiliser tryparse.

+0

dans votre requête assurez-vous qu'il n'y a pas DBNull. Quel serveur utilisez-vous? –

+0

voir la référence http://www.w3schools.com/sql/sql_isnull.asp, utilisez la méthode pour vérifier la valeur null avec SQL. –

+0

Que voulez-vous qu'il se passe? –

Répondre

4

Une autre alternative serait de vérifier si le datarow est DBNull:

double d = datarow is DBNull ? 0 : double.Parse(Convert.ToString(datarow)); 

De cette façon, vous n'avez pas besoin de vérifier DBNull.Value

3

DBNull ne peut pas être cast ou parsé à double (ou int, decimal, etc.), donc vous devez vérifier si datarow est DBNull avant d'essayer de l'analyser. Il devrait être un oneliner en utilisant l'opérateur ternaire:

doubleValue = datarow == DBNull.Value ? 0.0 : double.Parse(Convert.ToString(datarow)); 
+0

probablement entre crochets dans l'ordre différent –

+0

l'erreur était que le résultat doit être affecté à une variable – Breeze

3

J'ai un tas de méthodes utilitaires de conversion pour de tels scénarios, dans le format similaire à ce sujet.

// tries to convert a general object to double, if a defaultValue is provided, it will silently fall back to it, if not, it will throw exceptions 
public static double ToDouble(object obj, double? defaultValue = null) { 
    if (obj == null || obj == "" || obj == DBNull.Value) return 0.0; 
    try { 
    if (obj is string) 
     return double.Parse((string)obj); 
    return Convert.ToDouble(obj); 
    } catch { 
    if (defaultValue != null) return defaultValue.Value; 
    throw; 
    } 
} 

J'utilise ce genre d'utilitaires de conversion de type faible à fort surtout quand je travaille avec des trucs de ADO.NET, ou d'autres interfaces faiblement typés, comme la lecture des données à partir d'Excel par exemple.

Dans mon code réel, je permets également de passer un CultureInfo pour la conversion de chaîne, et faire d'autres choses comme la normalisation des signes décimaux, etc. pour obtenir la meilleure tolérance de format.

La clause de capture générale pourrait être améliorée bien sûr en attrapant des types d'exception spécifiques comme FormatException, mais pour mes besoins cela fonctionne bien.