2012-04-19 23 views
8

Leo mi base de datos usando DataReader.C# Comprobación nula de objeto

y algunas filas no tienen valor de fecha.

así que cuando convierto la fecha nula en DateTime, se produce un error.

¿Cómo puedo verificar el campo vacío o no?

AdsCommand cmd = conn.CreateCommand(); 
cmd.CommandText = "select name,fdate from abc"; 

AdsDataReader reader = cmd.ExecuteReader(); 

DateTime flsdate = (reader["fdate"].Equals(null))? Convert.ToDateTime(reader["fdate"]) : DateTime.Today; 

he intentado con los iguales, pero no funciona.

¿alguien sabe cómo comprobar el objeto nulo para evitar el error de conversión?

Gracias!

+0

Use '==' o '! =' Not '.Equals'. Además, es posible que deba verificar con 'DBNull', no solo' null'. (Sí, son diferentes) .. – Servy

+0

Posible de duplicar? http://stackoverflow.com/questions/3432974/datareader-is-null-or-empty –

Respuesta

11

Como todos le indicaron cómo resolver el problema, estoy tratando de darle la información sobre la diferencia entre NULL y DBNull.

  • null y DBNull son diferentes.

  • null no es una instancia de ningún tipo. DBNull es una clase singleton con una instancia: DBNull.Value.

  • null representa una referencia no válida donde DBNull.Value representa un valor inexistente en DB.

  • DBNull.Value es lo que los proveedores de db proporcionan para un valor inexistente en una tabla.

Con ese fondo (reader["fdate"].Equals(null)) no es correcto utilizar aquí. Tienes que verificarlo con DBNull.Value. Si es del tipo DBNull, o si es igual a DBNull.Value, asigne el valor que desee.

+3

+1 para realmente explicar algo. Me tomé la libertad de editarlo un poco; por favor, deshaga cualquier cambio con el que no esté de acuerdo. – phoog

+0

@phoog Gracias por hacerlo mejor. – Sandeep

2
DateTime flsdate = reader["fdate"].Equals(DBNull.Value) 
    ? Convert.ToDateTime(reader["fdate"]) 
    : DateTime.Today; 

Pero parece peligrosa por defecto la fecha de Today. Me gustaría hacer esto en su lugar:

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value) 
    ? Convert.ToDateTime(reader["fdate"]) 
    : (DateTime?)null; 

Por otra parte, si el TPE subyacente de la columna de la fdate ya es DateTime, no utilice System.Convert:

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value) 
    ? (DateTime?)reader["fdate"]) 
    : null; 
1

Pruebe lo siguiente:

DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value 
    ? DateTime.ParseExact(reader["fdate"]) 
    : DateTime.Today; 
1
DateTime flsdate = DateTime.Today; 
if(reader["fdate"] != null) 
    flsdate = Convert.ToDateTime(reader["fdate"]) 
4

En una situación como esta me gusta representar columnas de base de datos con valores nulos, ya sea con un tipo de referencia (cadena para varchar) o una Anulable envuelto tipo de valor (DateTime?). De esta forma, representa con mayor precisión el esquema de la base de datos en su programa.

Esto también le permite escribir de forma más limpia de la lógica de conversión utilizando el formato: (? DateTime)

DateTime? fdate = datareader["fdate"] as DateTime?; 

Este molde se producirá un error en el caso de que el resultado datareader es un DBNull y FDATE se establece por defecto , que es nulo En ese momento, puede obtener su valor real deseado comprobando si el tipo que admite nulos tiene un valor o no (fdate.HasValue), y si no, utilizando su valor predeterminado: DateTime.Today.

Cuestiones relacionadas