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