Is there any difference between null and System.DBNull.Value? If yes, what is it?
I noticed this behavior now -
while (rdr.Read())
{
if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)
{
int x = Convert.ToInt32(rdr["Id"]);
}
}
While I retrieve data from the database using a sql datareader, though there is no value returned if(rdr["Id"] != null) returned true and eventually threw an exception for casting a null as integer.
But, this if I use if (rdr["Id"] != System.DBNull.Value) returns false.
What's the difference between null and System.DBNull.Value?
Well,
nullis not an instance of any type. Rather, it is an invalid reference.However,
System.DbNull.Value, is a valid reference to an instance ofSystem.DbNull(System.DbNullis a singleton andSystem.DbNull.Valuegives you a reference to the single instance of that class) that represents nonexistent* values in the database.*We would normally say
null, but I don't want to confound the issue.So, there's a big conceptual difference between the two. The keyword
nullrepresents an invalid reference. The classSystem.DbNullrepresents a nonexistent value in a database field. In general, we should try avoid using the same thing (in this casenull) to represent two very different concepts (in this case an invalid reference versus a nonexistent value in a database field).Keep in mind, this is why a lot of people advocate using the null object pattern in general, which is exactly what
System.DbNullis an example of.