2010-10-20 168 views
7

我已經看到了許多這樣的版本,但它們都不符合我的需求。處理日期時間DBNull

我的數據來自供應商數據庫,該數據庫允許DateTime字段爲空。首先,我將數據放入DataTable中。

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

我的DataTable轉換爲列表<>進行處理。

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

那麼,在這種情況下如何檢查DBNull?我試圖寫一個方法。

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

回答

7

一種可能的選擇是將其存儲爲一個可空的日期時間的語法DateTime?

這裏是一個link to the MSDN關於使用可空類型

+0

所以我的設備對象定義'DateTime'領域''的DateTime如果 – 2010-10-20 14:24:16

+0

這是一個有效的商業案例爲您設備沒有開始或結束日期,那麼是的。否則,你的數據庫層應該拋出一個異常。 – 2010-10-20 14:29:22

+1

是的 - 這是'Nullable '的快捷方式' – 2010-10-20 14:30:26

6

使用IsDBNull()

System.Convert.IsDBNull(value); 

,或者如果你有一個SqlDataReader

reader.IsDBNull(ordinal); 

,讓你DateTime屬性可爲空(DateTime?),並在DBNull情況下設置nullField<T>()會自動做到這一點。

0

這裏的一些代碼一個例子,我用它來讀取日期時間

IM確保它可以寫成更好,但運行正常,我

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

您應該使用DataRow["ColumnName"] is DBNull來比較DateTime null。

例如爲:

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

我發現,處理這個最簡單的方法是使用「as」關鍵字投領域作爲數據類型。這對於可以爲null的數據庫字段非常適用,並且非常簡單。

這裏是關於這個更詳細:Direct casting vs 'as' operator?

?例如:

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

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