103 votes

Quelle est la difference entre null et System.DBNull.Value?

Quelle est la différence entre la valeur null et du Système.DBNull.De la valeur? Si oui, quel est-il?

J'ai remarqué ce comportement -

while (rdr.Read())
{
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)  
    {
        int x = Convert.ToInt32(rdr["Id"]);
    }
}

Alors que je récupérer les données de la base de données en utilisant sql datareader, si aucune valeur n'est retournée if(rdr["Id"] != null) retourné true et, finalement, a déclenché une exception pour la coulée d'une valeur null comme entier.

Mais, si je l'ai utiliser if (rdr["Id"] != System.DBNull.Value) retours false.

Quelle est la différence entre la valeur null et du Système.DBNull.De la valeur?

137voto

Jason Points 125291

Eh bien, null n'est pas une instance de n'importe quel type. Plutôt, il est une référence non valide.

Toutefois, System.DbNull.Value, est une référence valide pour une instance d' System.DbNull (System.DbNull est un singleton et System.DbNull.Value vous donne une référence à l'instance unique de la classe) qui représente inexistant* valeurs dans la base de données.

*Nous dirais normalement null, mais je ne veux pas confondre la question.

Donc, il y a une grande différence conceptuelle entre les deux. Le mot-clé null représente une référence non valide. La classe System.DbNull représente une inexistant valeur dans un champ de base de données. En général, nous devrions essayer d'éviter d'utiliser la même chose (dans ce cas - null) représentent deux des concepts très différents (dans ce cas une référence non valide par rapport à une inexistant valeur dans un champ de base de données).

Gardez à l'esprit, c'est pourquoi beaucoup de personnes recommandent à l'aide de l' objet nul motif en général, ce qui est exactement ce que System.DbNull en est un exemple.

23voto

Heinzi Points 66519

De la documentation de la classe DBNull :

Ne confondez pas la notion de null dans un langage de programmation orienté objet avec un objet DBNull. Dans un langage de programmation orienté objet, null signifie l'absence de référence à un objet. DBNull représente une variante non initialisée ou une colonne de base de données inexistante.

12voto

Loathing Points 221

DBNull.Value est agaçant d'avoir à traiter.

J'utilise des méthodes statiques qui vérifient s'il s'agit de DBNull, puis renvoient la valeur.

 SqlDataReader r = ...;
String firstName = getString(r[COL_Firstname]);

private static String getString(Object o) {
   if (o == DBNull.Value) return null;
   return (String) o;
}
 

De même, lors de l'insertion de valeurs dans un DataRow, vous ne pouvez pas utiliser "null", vous devez utiliser DBNull.Value.

Avoir deux représentations de "null" est une mauvaise conception sans aucun avantage apparent.

5voto

James Michael Hare Points 19077

DBNull.Value est ce que les fournisseurs de base de données .NET considèrent comme une entrée NULL dans la base de données. DBNull.Value n'est pas null et la comparaison à null pour les valeurs de colonne extraites d'une ligne de base de données ne fonctionnera pas, vous devez toujours comparer à DBNull.Value.

http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx

4voto

Daniel Mošmondor Points 10926

DataRow a une méthode appelée IsNull() que vous pouvez utiliser pour tester la colonne si elle a une valeur null - en ce qui concerne la valeur null telle qu'elle est vue par la base de données.

DataRow["col"]==null sera toujours false .

utilisation

 DataRow r;
if (r.IsNull("col")) ...
 

au lieu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X