2016-06-24 105 views
0

注:這是不是how-to-get-nullable-datetime-out-of-the-database重複,因爲我特別要避免使用列索引指定的轉換是無效

我有以下對象

public class MyClass 
{ 
    public int ID { get; set; } 
    public DateTime? Deleted { get; set; } 
} 

和下面的代碼來從數據庫中提取所述物體

MyClass c = new MyClass(); 
using (SqlConnection conn = new SqlConnection()) 
{ 
    conn.ConnectionString = "MyConnectionString"; 
    SqlCommand cmd = new SqlCommand("SELECT ID,Deleted FROM MyTable", conn); 
    conn.Open(); 
    SqlDataReader sdr = cmd.ExecuteReader(); 
    if (sdr != null && sdr.HasRows) 
    { 
     while (sdr.Read()) 
     { 
      c.CampID = (int)sdr["ID"]; 
      c.Deleted = (DateTime?)sdr["Deleted"]; 
     } 
     sdr.Close(); 
    } 
    conn.Close(); 
} 
return c; 

如果刪除日期是NUL L I得到一個錯誤

指定的轉換無效

我在做什麼錯?我怎樣才能以這種方式拋出一個可空的日期時間字段?

我有兩個醜陋的黑客可以完成工作。這:

try{ 
    c.Deleted = (DateTime?)sdr["Deleted"]; 
} 
catch{ 
    // ignoring a catch makes me feel unclean 
} 

或本

if(!string.isNullOrEmpty(sdr["Deleted"].ToString())) 
{ 
    // not quite so bad, but still not very elegant 
    c.Deleted = (DateTime?)sdr["Deleted"]; 
} 

是否有一個更清潔,更優雅的方式來做到這一點?

注:我不想使用字段索引,即

sdr.GetDateTime(i); 

回答

0

希望這是有益

c.Deleted = sdr["Deleted"] == DBNull.Value ? 
        (DateTime?)null : Convert.ToDateTime(sdr["Deleted"]); 
+0

爲'支票DBNull.Value'本身是正確和清晰的,但如果值已經存在,爲什麼要使用'Convert.ToDateTime'已知是一個'DateTime'?我並不是說這是錯的,我說這個答案可以從解釋中獲益,而不僅僅是代碼。 – hvd

-1

測試此:

c.Deleted = sdr["Deleted"] as DateTime?; 
+0

爲什麼默認爲原始代碼返回'null'的當前時間?爲什麼不只是'作爲DateTime?'? –

+1

這甚至不應該編譯。 – hvd