2010-10-20 21 views
7

SO üzerinde birçok, birçok sürümü gördüm, ancak bunların hiçbiri ihtiyaçlarım için çok işe yaramıyor.Bir DateTime Kullanılıyor DBNull

Verilerim, DateTime alanları için null izin veren bir satıcı veritabanından geliyor. Önce verileri bir DataTable'a çekiyorum.

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

Ben işlenmek üzere bir List <> bir DataTable dönüştürme ediyorum.

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

Bu durumda DBNull'u nasıl denetlerim? Bir yöntem yazmaya çalıştım. Kullanım IsDBNull()

System.Convert.IsDBNull(value); 

veya eğer

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

cevap

7

Olası bir seçenek sözdizimi İşte DateTime?

bir null tarih zamanı olarak saklayın i

tarihsaat okumak için kullanan bazı kod örneği null türleri burada
+0

DateTime 'olarak' DateTime' alanları tanımlamak ' –

+0

bunun için geçerli bir iş durumda senin Başlangıç ​​ya da bitiş tarihi olmayan ekipman evet. Aksi halde db katmanınız bir istisna atmalıdır. –

+1

yep - Nullable 'için kısayol –

6

Bir SqlDataReader

reader.IsDBNull(ordinal); 

sahip Ve DateTime özelliklerinin null olması (DateTime?) yapmak ve DBNull durumunda null ayarlayın. Field<T>() otomatik olarak bunu yapacaktır.

0

kullanmayla ilgili bir link to the MSDN olduğu daha iyi yazılır ama olabilir emin

im beni

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

Senkullanmalıdır daha iyi çalışır DateTime null öğelerini karşılaştırmak için.

Örn .:

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

Bunu işlemek için en kolay yolu "olarak" anahtar kelime kullanarak veri türü olarak alan döküm olduğunu bulduk. Bu, boş olabilen veritabanı alanları için harika ve güzel ve basittir. İşte

Bu konuda daha fazla detay: Direct casting vs 'as' operator?

Örnek:?

benim Ekipmanları nesne üzerinde Yani
IDataRecord record = FromSomeSqlQuerySource; 
    string nullableString; 
    DateTime? nullableDateTime; 

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