2009-01-08 5 views
7

Lorsque je récupère une valeur scalaire de la base de données, j'écris généralement du code comme celui-ci pour les champs Nullable.Comment puis-je vérifier DBNull en n'exécutant ma commande qu'une seule fois?

cmd.ExecuteScalar() == DBNull.Value ? 0 : (int)cmd.ExecuteScalar() 

Mais je ne l'aime pas car il exécute deux fois l'instruction Executescalar. C'est un voyage supplémentaire au serveur pour mon site web et en faveur de la performance, je ne veux pas faire cela.

Y a-t-il un moyen de me débarrasser de ce extra ExecuteScalar()?

+0

Le choix évident est d'utiliser deux lignes. Y a-t-il une raison pour laquelle vous l'avez écrite de cette façon? Si c'est juste pour le garder à une ligne, je pense que cela prend l'extrême à l'extrême. – BobbyShaftoe

Répondre

17

vous Ecrivez une méthode d'extension pour la commande SQL.

public static T ExecuteNullableScalar<T>(this SqlCommand cmd) 
    where T : struct 
{ 
    var result = cmd.ExecuteScalar(); 
    if (result == DBNull.Value) return default(T); 
    return (T)result; 
} 

Utilisation devient:

int value = cmd.ExecuteNullableScalar<int>(); 
+0

mise en place T: struct ne permet pas d'utiliser des chaînes. J'ai enlevé l'héritage. –

+0

Pour quiconque essaye d'utiliser cette solution pour vb, l'un des changements importants est 'result == DBNull.Value' et devient' result is DBNull.Value'. Si vous essayez d'utiliser l'opérateur '=', une erreur sera générée. –

12

Il suffit d'utiliser une variable pour mettre en cache le résultat:

var o = cmd.ExecuteScalar(); 
return o == DBNull.Value ? 0 : (int)o; 
4
object o = cmd.ExecuteScalar(); 
return (o== DBNull.Value) ? 0 : (int)o; 
+0

Je préfère cela à "var." Je pense que l'utilisation de "var" est, comme je m'y attendais, abusée. Bien que je me rende compte que certaines personnes, Jon Skeet par exemple, croient que c'est plus lisible, ce que je ne comprends pas. – BobbyShaftoe

+2

Vraiment? Vous vous souciez quel type "o" est dans ce code? Il est mis au rebut sur la ligne suivante. En tant que lecteur du code, l'utilisation de "object" vs "var" est juste du bruit pour moi. –