2010-10-20 11 views
7

He visto muchas, muchas versiones de esto en SO, pero ninguna de ellas parece funcionar para mis necesidades.Manejo de DateTime DBNull

Mis datos provienen de una base de datos de proveedores que permite campos nulos para DateTime. Primero, transfiero mis datos a una DataTable.

using (SqlCommand cmd = new SqlCommand(sb.ToString(), conn)) 
using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
{ 
    da.Fill(dt); 
} 

Estoy convirtiendo un DataTable a una lista <> para su procesamiento.

var equipment = from i in dt.AsEnumerable() 
    select new Equipment() 
    { 
     Id = i.Field<string>("ID"), 
     BeginDate = i.Field<DateTime>("BeginDate"), 
     EndDate = i.Field<DateTime>("EndDate"), 
     EstimatedLife = i.Field<double>("EstimatedLife") 
    } 

Así que, ¿cómo puedo comprobar por DBNull en este caso? Traté de escribir un método.

public DateTime CheckDBNull(object dateTime) 
    { 
     if (dateTime == DBNull.Value) 
      return DateTime.MinValue; 
     else 
      return (DateTime)dateTime; 
    } 

Respuesta

7

Una opción posible es almacenarlo como una fecha y hora anulable con la sintaxis DateTime?

Aquí está una link to the MSDN sobre el uso de tipos anulables

+0

Así que en mi equipo objeto definir la acción 'DateTime' campos como' 'DateTime –

+0

Si se trata de un modelo de negocio válido para su Equipo para no tener una fecha de inicio o final, entonces sí. De lo contrario, su capa de db debería arrojar una excepción. –

+1

sí, es un atajo para 'Nullable ' –

6

Uso IsDBNull()

System.Convert.IsDBNull(value); 

o si tiene un SqlDataReader

reader.IsDBNull(ordinal); 

y hacer que sus propiedades sean DateTime anulable (DateTime?) y ajuste null en caso de DBNull. Field<T>() hará esto automáticamente.

0

aquí es un ejemplo de un código que utilizo para leer datetimes

im seguro de que se podría escribir mejor, pero funciona muy bien para mí

public DateTime? ReadNullableDateTimefromReader(string field, IDataRecord data) 
    { 

     var a = data[field]; 
     if (a != DBNull.Value) 
     { 
      return Convert.ToDateTime(a); 
     } 
     return null; 
    } 

    public DateTime ReadDateTimefromReader(string field, IDataRecord data) 
    { 
     DateTime value; 
     var valueAsString = data[field].ToString(); 
     try 
     { 
      value = DateTime.Parse(valueAsString); 
     } 
     catch (Exception) 
     { 
      throw new Exception("Cannot read Datetime from reader"); 
     } 

     return value; 
    } 
0

debe utilizar DataRow["ColumnName"] is DBNull para comparar DateTime null.

ej .:

if(studentDataRow["JoinDate"] is DBNull) { // Do something here } 
1

He encontrado que la mejor manera de manejar esto es para echar el campo como su tipo de datos utilizando el "como" palabra clave. Esto funciona muy bien para campos de base de datos que pueden ser nulos, y es agradable y simple.

Aquí hay más detalles sobre esto: Direct casting vs 'as' operator?

Ejemplo:?

IDataRecord record = FromSomeSqlQuerySource; 
    string nullableString; 
    DateTime? nullableDateTime; 

    nullableString = record["StringFromRecord"] as string; 
    nullableDateTime = record["DateTimeFromRecord"] as DateTime?;