2017-05-31 80 views
1

我正在將我的DataTable轉換爲泛型列表,並且在將行值轉換爲列表的對象時,它給出了Cast Exception。我嘗試使用代碼處理DBNull處理DateTime的DBNull值

if (dataRow["DateCompleted"] == DBNull.Value) 
{ 
    dataRow["DateCompleted"] = null; 
} 
if (dataRow["TotalRecords"] == DBNull.Value) 
{ 
    dataRow["TotalRecords"] = 0; 
} 
if (dataRow["CompanyName"] == DBNull.Value) 
{ 
    dataRow["CompanyName"] = ""; 
} 

但DateCompleted不接受null,DBNull或空字符串。

的過程後,我正在做的物體,像

DemoData demoValue = new DemoData 
{ 
    CompanyName = dataRow["CompanyName"].ToString(), 
    DateCompleted = (DateTime)dataRow["DateCompleted"], 
    TotalRecords = (int)dataRow["TotalRecords"] 
}; 

並添加對象添加到列表

DataList.Add(demoValue); 

我的目錄是

public List<DemoData> DataList = new List<DemoData>(); 

和我的課是

public class DemoData 
{ 
    public string CompanyName { get; set; } 
    public DateTime DateCompleted { get; set; } 
    public int TotalRecords { get; set; } 
} 
+0

我通常只是用新的DateTime(),它會默認日期到1900年1月1日。DateTime將不接受null。 – jdweng

+3

嘗試使用'Nullable '或'DateTime?'作爲'DateCompleted'字段 –

+0

@jdweng這不可行,因爲在我的應用程序中,日期和時間是重要因素,因此不能設置爲默認值,但可以爲空 – Jaideep

回答

0

DateCompleted可空在你的類:

public class DemoData 
{ 
    public string CompanyName { get; set; } 
    public DateTime? DateCompleted { get; set; } 
    public int TotalRecords { get; set; } 
} 
+0

它給出異常'無法設置列'DateCompleted'爲空。請使用DBNull代替.' – Jaideep

+0

當我使用DBNull時,它給出了一個錯誤,如'指定的轉換無效',即InvalidCastException – Jaideep

0

答案取決於業務邏輯要執行,如果DemoData完成:

您可能要堅持null;它使,但是,邏輯更複雜(因爲null特例現在),並要求DemoData修改:

public class DemoData 
{ 
    public string CompanyName { get; set; } 
    // DateTime? - DateCompleted is Nullable<DateTime> 
    public DateTime? DateCompleted { get; set; } 
    public int TotalRecords { get; set; } 
} 
... 

DemoData demoValue = new DemoData { 
    CompanyName = dataRow["CompanyName"].ToString(), 
    DateCompleted = dataRow.IsDbNull("DateCompleted") 
    ? null // <- now we can assign null to Nullable<T> 
    : (DateTime?) dataRow["DateCompleted"], 
    TotalRecords = (int)dataRow["TotalRecords"] 
}; 

您可能需要採取以下(典型值)的邏輯:「如果DemoData沒有尚未完成,它應是最終在(遙遠)未來「完成:

... 
if (dataRow["DateCompleted"] == DBNull.Value) 
{ 
    // Well, at 31 Dec 9999 it'll be completed for sure... 
    dataRow["DateCompleted"] = DateTime.MaxValue; 
} 

... 

DemoData demoValue = new DemoData 
{ 
    CompanyName = dataRow["CompanyName"].ToString(), 
    DateCompleted = (DateTime)dataRow["DateCompleted"], 
    TotalRecords = (int)dataRow["TotalRecords"] 
}; 
+0

它不會被更新,因爲我工作的公司是一個數據處理公司,所以記錄只保留,不更新。所以如果我將它設置爲MaxValue,那麼它會影響我的數據驅動的UI部件,如Graph和GridView,我使用這些數據本身來填充。 – Jaideep

0

由於源AA數據表中嘗試這樣的事情

  DataTable dt = new DataTable(); 
      dt.Columns.Add("date", typeof(DateTime)); 
      dt.Columns["date"].AllowDBNull = true; 

      dt.Rows.Add(); 
      dt.Rows[0]["date"] = DBNull.Value; 
+0

它已經有了DBNull值,所以我猜'DataTable'默認情況下接受了DBNull值,沒有必要顯式地寫出它 – Jaideep

0

所以我想通了,這個問題是我的dataRow所以它不接受任何值指派空值本身,我寫了這樣的代碼現在它的正常工作

DateTime? dateCompleted; 
if (dataRow["DateCompleted"] == DBNull.Value) 
{ 
    dateCompleted= null; 
} 
else 
{ 
    dateCompleted= (DateTime)dataRow["DateCompleted"]; 
} 
DemoData demoValue = new DemoData 
{ 
    CompanyName = dataRow["CompanyName"].ToString(), 
    DateCompleted = dateCompleted, 
    TotalRecords = (int)dataRow["TotalRecords"] 
}; 

以及類

public class DemoData 
{ 
    public string CompanyName { get; set; } 
    public DateTime? DateCompleted { get; set; } 
    public int TotalRecords { get; set; } 
}