¿Hay alguna diferencia entre null y System.DBNull.Value? ¿Y si si, que?
Noté este comportamiento ahora -
while (rdr.Read())
{
if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)
{
int x = Convert.ToInt32(rdr["Id"]);
}
}
Mientras que recuperar datos de la base de datos utilizando un datareader SQL, aunque no hay valor devuelto if(rdr["Id"] != null)
devuelto true
y, finalmente, lanzó una excepción para la fundición de un nulo como entero.
Pero, esto si utilizo if (rdr["Id"] != System.DBNull.Value)
devoluciones false
.
¿Cuál es la diferencia entre null y System.DBNull.Value?
System.Data
, y el otro es un valor especial que significa la falta de un referente. No tienen nada que ver el uno con el otro. ¿Puedes explicar en qué estás confundido? Su verdadera pregunta es "¿por qué hacerDataRows
yDataReaders
ponerDBNull.Value
dentro de sí mismos en lugar denull
?"null
.Respuestas:
Bueno,
null
no es una instancia de ningún tipo. Más bien, es una referencia inválida.Sin embargo,
System.DbNull.Value
es una referencia válida a una instancia deSystem.DbNull
(System.DbNull
es un singleton ySystem.DbNull.Value
le da una referencia a la instancia única de esa clase) que representa valores inexistentes * en la base de datos.* Normalmente diríamos
null
, pero no quiero confundir el problema.Entonces, hay una gran diferencia conceptual entre los dos. La palabra clave
null
representa una referencia no válida. La claseSystem.DbNull
representa un valor inexistente en un campo de base de datos. En general, deberíamos intentar evitar usar lo mismo (en este casonull
) para representar dos conceptos muy diferentes (en este caso una referencia inválida versus un valor inexistente en un campo de base de datos).Tenga en cuenta que esta es la razón por la que mucha gente aboga por el uso del patrón de objeto nulo en general, que es exactamente de lo que
System.DbNull
es un ejemplo.fuente
IDbCommand.ExecuteScalar()
, puede devolver nulo (no se devuelven registros) oDbNull
(la primera columna del primer registro es un 'valor inexistente'). SinDbNull
usted no podría distinguir uno del otro.De la documentación de la clase DBNull :
fuente
Es molesto tener que lidiar con DBNull.Value.
Utilizo métodos estáticos que comprueban si es DBNull y luego devuelven el valor.
SqlDataReader r = ...; String firstName = getString(r[COL_Firstname]); private static String getString(Object o) { if (o == DBNull.Value) return null; return (String) o; }
Además, al insertar valores en un DataRow, no puede usar "nulo", debe usar DBNull.Value.
Tener dos representaciones de "nulo" es un mal diseño sin beneficio aparente.
fuente
DBNull.Value es lo que devuelven los proveedores de la base de datos .NET para representar una entrada nula en la base de datos. DBNull.Value no es nulo y las comparaciones con nulo para los valores de columna recuperados de una fila de la base de datos no funcionarán, siempre debe comparar con DBNull.Value.
http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx
fuente
DataRow tiene un método que se llama
IsNull()
que puede usar para probar la columna si tiene un valor nulo, con respecto al nulo tal como lo ve la base de datos.DataRow["col"]==null
siempre lo seráfalse
.utilizar
DataRow r; if (r.IsNull("col")) ...
en lugar.
fuente
Null es similar al puntero cero en C ++ . Entonces es una referencia que no apunta a ningún valor .
DBNull.Value
es completamente diferente y es una constante que se devuelve cuando un valor de campo contiene NULL.fuente