¿Cómo lanzar con seguridad el resultado anulable de SQLReader a INT?
-
28-10-2019 - |
Pregunta
Tengo una tabla que contiene valores nulos y necesito obtener datos de la tabla utilizando SQLDATEAREADER. No puedo entender cómo puedo lanzar de forma segura a Dbnull a Int.
Lo estoy haciendo de esta manera en este momento:
...
reader = command.ExecuteReader();
while (reader.Read()) {
int y = (reader["PublicationYear"] != null) ? Convert.ToInt32(reader["PublicationYear"]) : 0;
...
}
...
Pero conseguir un Object cannot be cast from DBNull to other types.
Cuando la publicación es nula.
¿Cómo puedo obtener el valor de forma segura?
Gracias.
Solución
Deberías comparar reader["PublicationYear"]
a DBNull.Value
, no null
.
Otros consejos
DBNull
no es lo mismo que null
. Deberías probar algo como esto en su lugar:
int y = (reader["PublicationYear"] != DBNull.Value) ? ...
int ord = reader.GetOrdinal("PublicationYear");
int y = reader.IsDBNull(ord) ? 0 : reader.GetInt32(ord);
O alternativamente:
object obj = reader["PublicationYear"];
int y = Convert.IsDBNull(obj) ? 0 : (int)obj;
Debe verificar explícitamente si el valor devuelto es de tipo DBNull
while (reader.Read()) {
int y = (!reader["PublicationYear"] is DBNull) ? Convert.ToInt32(reader["PublicationYear"]) : 0;
...
}
De hecho, puede hacer esta comparación por valor y tipo:
reader["PublicationYear"] != DBNull.Value
En resumen, puedes esperar DBNull
ser devuelto para nulos de la base de datos, en lugar de nulo.
Como alternativa, puedes hacer lo siguiente. A medida que está convirtiendo dbnull en 0, altere el procedimiento que realiza el selección. de modo que la selección misma devuelve cero para un valor nulo.
fragmento para demostrar la idea
SELECT ...
,ISNULL (PublicationYear, 0) as PublicationYear
...
FROM sometable
La ventaja de esto es que no se necesita verificación adicional en su código.
Cambio
reader["PublicationYear"] != null
a
reader["PublicationYear"] != DBNull.Value
Ese es el error: (reader["PublicationYear"] != null)
Deberías probar para dbnull.value ....
Cambia tu prueba desde (reader["PublicationYear"] != null)
a (reader["PublicationYear"] != DBNull.Value)
.
Los valores nulos de la base de datos deben compararse con dbnull.Value
reader = command.ExecuteReader();
while (reader.Read()) {
int y = (reader["PublicationYear"] != DBNull.Value) ? Convert.ToInt32(reader["PublicationYear"]) : 0;
...
}