web-dev-qa-db-fra.com

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

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?

81
pavanred

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.

102
jason

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.

20
Heinzi

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.

10
Loathing

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

5
James Michael Hare

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.

3
Daniel Mošmondor

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.

3
Aliostad