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.

¿Fue útil?

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; ... }

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top