2012-11-25 46 views
9

我有兩個DateTime對象,BirthDate和HireDate。它們被正確格式化爲一個字符串,當我將它們傳遞給我的數據訪問層時,它們需要被解析成一個DateTime對象。如何管理解析空值對象的DateTime用於ADO.NET作爲DBNULL

DateTime hD = DateTime.Parse(hire);    
DateTime bD = DateTime.Parse(birth); 

//incase of a datestring being passed through 
dateStringPassed = "7/2/1969"; 

但有時,串hirebirth爲空或空"",如果代碼運行這樣的,我是從解析空字符串得到出現FormatException錯誤。如何管理空分析並允許將DateTime(如果爲空或空)接受爲DBNull.Value

我仍然無法管理用戶不通過DateTime字符串,然後解析崩潰我的代碼。

我的出生日期參數如下,並檢查變量是否爲空,然後使用DBNull.Value。

回答

2

您需要使用nullable日期時間 - 快捷鍵語法爲DateTime?(注意末尾的?)。

DateTime? hD = null; 
if(!string.IsNullOrWhitespace(hire)) // string.IsNullOrEmpty if on .NET pre 4.0 
{ 
    hD = DateTime.Parse(hire);    
} 

可以測試hD.HasValue,如果不使用DbNull.Value代替。

+0

你能寫一個DateTime bD = DateTime.Parse(出生)的例子嗎?在最後使用'?'還會爲'int'工作嗎? – GivenPie

+0

@GivenPie - 是的,它會用於'int'和任何值類型。 – Oded

+0

很酷,謝謝Oded! – GivenPie

9

Parse方法無法處理空字符串,但您可以使用可空DateTime和做這樣的事情:

DateTime? hD = String.IsNullOrEmpty(hire) ? (DateTime?)null : DateTime.Parse(hire) 

但是更安全會使用TryParse代替:

DateTime? hD = null; 
DateTime.TryParse(hire, out hD); 

然後用於存儲此值,可以測試hD.HasValue

if(hD.HasValue) { /* use hD */ } 
else { /* else use DBNull.Value */ } 

由於C#7,你可以使用更短的語法內嵌了參數,你就可以避免空類型乾脆:

if (DateTime.TryParse(hire, out var hD)) { /* use hD */ } 
else { /* use DBNull.Value */ } 
+1

我相信你必須在該三元運算符中施加'null'才能得到該行的編譯結果。 ':'的兩邊需要是在它們之間有隱含轉換的相同類型或類型。 – Oded

+0

你說得對,我會編輯我的答案。 –

+1

而最後一行 - 我看不出如何編譯它,以便編譯器可以接受它。 – Oded

0

如果您使用此方法,這是任何東西不是一個正確的日期將返回DBNull.Value

/// <summary> 
/// Parses a date string and returns 
/// a DateTime if it is a valid date, 
/// if not returns DBNull.Value 
/// </summary> 
/// <param name="date">Date string</param> 
/// <returns>DateTime or DBNull.Value</returns> 
public static object CreateDBDateTime(string date) 
{ 
    DateTime result; 
    if (DateTime.TryParse(date, out result)) 
    { 
     return result; 
    } 
    return DBNull.Value; 
} 
相關問題