2012-11-25 29 views
1

我遇到了問題。這是我的代碼使用LINQ。當日期時間字段爲空時,LINQ中的「指定的轉換無效」

var resultCases = from row2 in dtCases.AsEnumerable() 
        where row2.Field<int>("caseID") == caseID2 
        select new 
        { 
           caseName = row2["caseName"].ToString(), 
           caseCourtPlace = row2["caseCourtPlace"].ToString(), 
           caseCourtRef = row2["caseCourtRef"].ToString(), 
           caseOfficeRef = row2["caseOfficeRef"].ToString(), 
           effectiveDate = ((DateTime)row2["caseEffectiveDate"]), 
           closedDate = ((DateTime)row2["caseClosedDate"]), 
           caseFolderPath = row2["casesFolderPath"].ToString(), 
           category = row2["categoryName"].ToString(), 
           department = row2["departmentName"].ToString(), 
           empName = row2["empName"].ToString(), 
           judgeName = row2["judgeName"].ToString(), 
           asName = row2["asCasesName"].ToString(), 
        }; 

如果closedDateeffectiveDate回報DBnull.Value,我得到

InvalidCastException的是未處理 - 指定的轉換是無效的。

那麼我該如何防止這個錯誤呢?

+0

'row2 [「ca seEffectiveDate「]'返回null或DBNull.Value?他們是不同的。在任何情況下,'row.Field (「caseEffectiveGate」)'是我將開始.. – 2012-11-25 06:12:17

+0

@ pst..Sorry誤解..是的,它返回DBNull.Value .. – Chuki2

+1

所以,然後開始'行。字段 ..'它工作嗎? (它應該返回'NULL'作爲'DBNull.Value',然後可以和coalesce一起使用 - 如果不允許空的DateTime,可以使用'??' - 運算符。) – 2012-11-25 06:31:48

回答

5

tldr; 問題有兩方面:DataTable使用DBNull.Value來表示「空」值,並且DBNull.Valuenull都不能澆鑄到DateTime

Field<T>擴展方法後來增加了使用空值處理DBNull和Nullable /引用類型變得更容易;它也隱藏了強類型簽名背後的轉換。這些LINQ to DataSet擴展方法knows how to map DBNull.Value to null as appropriate

由於這種使用row.Field<DateTime?>("caseEffectiveDate")將返回要麼DateTime?一個值(如果該查詢返回的值)或null,它也可能會拋出一個異常,如果服務器返回一個不兼容的價值 - 但它會永遠返回DBNull.Value

然而,標準row["caseEffectiveDate"]將返回一個DateTime值(或一些其他類型的),或者DBValue.Null鑄能夠DateTime?(更不用說DateTime)並導致錯誤描述。

這裏是如何最小重現此異常:

object v = DBNull.Value; 
DateTime dt = (DateTime)v; 

然而,細到轉換nullDateTime?

object v = null; 
DateTime? maybeDt = (DateTime?)v; 

再平凡的,如果凝聚它而去DateTime required:

object v = null; 
DateTime? dt = (DateTime?)v ?? DateTime.MinValue; 
+0

非常感謝您的信息和示例..;) – Chuki2

0

更新:試試這個

public static class ConversionExtensions 
{ 
    public static string SafeDateTime(this object value) 
    { 
     if (value == DBNull.Value) return string.Empty; 

     var valueType = value.GetType(); 
     if (typeof (DateTime?).IsAssignableFrom(valueType)) 
     { 
      var nullableValue = value as DateTime?; 
      if (nullableValue == null) return string.Empty; 
      return nullableValue.Value.ToString(); 
     } 
     if (typeof (DateTime).IsAssignableFrom(valueType)) 
     { 
      return ((DateTime) value).ToString(); 
     } 
     return string.Empty; 
    } 
} 

一個名爲:

effectiveDate = row2["caseEffectiveDate"].SafeDateTime() 
+0

仍然錯誤..感謝您的幫助... :) – Chuki2

+0

@ Chuki2我已經更新了我的迴應,另一種方法 –

+0

@ armen.shimoon ..有同樣的問題,感謝您的幫助。你有另一個建議? – Chuki2

相關問題