2010-10-20 5 views
7

J'ai vu beaucoup, beaucoup de versions de cela sur SO, mais aucun d'entre eux ne semble vraiment fonctionner pour mes besoins. Mes données proviennent d'une base de données fournisseur qui autorise la valeur NULL pour les champs DateHeure. D'abord je tire mes données dans un DataTable.Gérer un DateTime DBNull

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

Je suis un DataTable convertissent une liste <> pour le traitement.

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") 
    } 

Alors, comment puis-je vérifier DBNull dans cette instance? J'ai essayé d'écrire une méthode.

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

Répondre

7

Une option possible est l'enregistrer comme date heure nullable avec la syntaxe DateTime?

Voici un link to the MSDN sur l'utilisation de types nullables

+0

donc sur mon objet d'équipement définissent les 'DateTime' champs DATETIME' –

+0

Si c'est un cas d'affaires valable pour votre L'équipement n'a pas de date de début ou de fin alors oui. Sinon, votre couche db devrait lancer une exception. –

+1

yep - c'est un raccourci pour 'Nullable ' –

6

Utilisez IsDBNull()

System.Convert.IsDBNull(value); 

ou si vous avez un SqlDataReader

reader.IsDBNull(ordinal); 

Et faire vos DateTime propriétés à être annulable (DateTime?) et mis null en cas de DBNull. Field<T>() le fera automatiquement.

0

ici est un exemple d'un code-je utiliser pour lire DateTimes

im sûr qu'il pourrait être mieux écrit, mais fonctionne très bien pour moi

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

Vous devez utiliser DataRow["ColumnName"] is DBNull pour comparer DateTime null.

.: par exemple

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

J'ai trouvé que la meilleure façon de gérer cela est de jeter le champ comme type de données en utilisant le mot-clé « comme ». Cela fonctionne très bien pour les champs de base de données qui peuvent être null, et est agréable et simple.

Voici plus en détail sur ce point: Direct casting vs 'as' operator?

Exemple:

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

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