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"]);
}
}
Alors que je récupère des données de la base de données à l'aide d'un datareader sql, bien qu'aucune valeur ne soit if(rdr["Id"] != null)
renvoyée true
et que j'ai finalement jeté une exception pour convertir un null en entier.
Mais, ceci si j'utilise des if (rdr["Id"] != System.DBNull.Value)
retours false
.
Quelle est la différence entre null et System.DBNull.Value?
System.Data
, et l'autre est une valeur spéciale signifiant l'absence de référent. Ils n'ont rien à faire ensemble. Pouvez-vous expliquer ce qui vous trouble? Votre vraie question est-elle "pourquoi faireDataRows
et seDataReaders
mettre à l'DBNull.Value
intérieur d'eux-mêmes au lieu denull
?"null
.Réponses:
Eh bien, ce
null
n'est pas une instance d'aucun type. C'est plutôt une référence invalide.Cependant,
System.DbNull.Value
est une référence valide à une instance deSystem.DbNull
(System.DbNull
est un singleton etSystem.DbNull.Value
vous donne une référence à l'instance unique de cette classe) qui représente des valeurs * inexistantes dans la base de données.* Nous dirions normalement
null
, mais je ne veux pas confondre le problème.Il y a donc une grande différence conceptuelle entre les deux. Le mot-clé
null
représente une référence non valide. La classeSystem.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 casnull
) pour représenter deux concepts très différents (dans ce cas une référence invalide versus une valeur inexistante dans un champ de base de données).Gardez à l'esprit que c'est pourquoi beaucoup de gens préconisent l'utilisation du modèle d'objet nul en général, ce qui est exactement ce dont
System.DbNull
est un exemple.la source
IDbCommand.ExecuteScalar()
, il peut renvoyer null (aucun enregistrement retourné) ouDbNull
(la première colonne du premier enregistrement est une «valeur inexistante»). SansDbNull
vous ne pourriez pas distinguer l'un de l'autre.De la documentation de la classe DBNull :
la source
DBNull.Value est ennuyeux d'avoir à gérer.
J'utilise des méthodes statiques qui vérifient si c'est DBNull, puis renvoie la valeur.
En outre, 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 «nul» est une mauvaise conception sans avantage apparent.
la source
DBNull.Value est ce que les fournisseurs de base de données .NET renvoient pour représenter une entrée nulle dans la base de données. DBNull.Value n'est pas null et comparissons à 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
la source
DataRow a une méthode appelée
IsNull()
que vous pouvez utiliser pour tester la colonne si elle a une valeur nulle - en ce qui concerne la valeur nulle telle qu'elle est vue par la base de données.DataRow["col"]==null
sera toujoursfalse
.utilisation
au lieu.
la source
Null est similaire au pointeur zéro en C ++ . C'est donc une référence qui ne pointe vers aucune valeur .
DBNull.Value
est complètement différent et est une constante qui est renvoyée lorsqu'une valeur de champ contient NULL.la source