Existe-t-il une différence entre null et System.DBNull.Value? Si oui, qu'est ce que c'est?
J'ai remarqué ce comportement maintenant -
while (rdr.Read())
{
if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)
{
int x = Convert.ToInt32(rdr["Id"]);
}
}
Bien que je récupère les données de la base de données à l'aide d'un datareader SQL, bien qu'il n'y ait pas de valeur retournée if(rdr["Id"] != null)
a retourné true
et a finalement levé une exception pour la conversion d'un null en entier.
Mais ceci si j'utilise if (rdr["Id"] != System.DBNull.Value)
renvoie false
.
Quelle est la différence entre null et System.DBNull.Value?
Eh bien, null
n'est une instance d'aucun type. C'est plutôt une référence invalide.
Toutefois, System.DbNull.Value
, est une référence valide à une instance de System.DbNull
(System.DbNull
est un singleton et System.DbNull.Value
vous donne une référence à la seule instance de cette classe) qui représente inexistante* valeurs dans la base de données.
* Nous dirions normalement null
, mais je ne veux pas confondre le problème.
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 valeur inexistante 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
) pour représenter deux concepts très différents (dans ce cas, une référence non valide par rapport à une valeur inexistante dans un champ de base de données).
Gardez à l’esprit, c’est pourquoi beaucoup de gens préconisent l’utilisation du modèle d’objet null en général, ce qui est exactement ce que System.DbNull
est un exemple de.
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.
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 plus, 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.
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
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.
Null est similaire à pointeur zéro en C++. Il s’agit donc d’une référence qui ne pointe sur aucune valeur .
DBNull.Value
est complètement différent et est un constant qui est renvoyé quand une valeur de champ contient NULL.