2015-12-03 101 views
-2

我收到此異常時,我的列的數據表中有一個空值。假設我想要允許空值或類似的東西,我該如何解決這個問題?字符串未被識別爲有效的日期時間。

字符串未被識別爲有效的DateTime。

這是我的代碼。

 foreach (DataRow row in ds.Tables[0].Rows) 
       { 
    row["Effective_Period"] = Convert.ToDateTime(row["Effect_Date_From"].ToString()).ToString("dd/MM/yyyy") 
+ " - " + Convert.ToDateTime(row["Effect_Date_To"].ToString()).ToString("dd/MM/yyyy"); 
    } 

在我ds.Table,這裏是我的專欄

---------------------- 
Effective_Period 
--------------------- 
10/2/2012 - 20/3/2012 
--------------------- 

--------------------- 

--------------------- 
+0

當列有'null'時你想要做什麼? –

+0

你不能將空列轉換爲datatime這就是爲什麼你會得到錯誤,我建議你更新你的存儲過程來處理空值,以便你不會返回任何空值。 – user2705620

+0

可能的重複http://stackoverflow.com/questions/2193012/string-was-not-recognized-as-a-valid-datetime-format-dd-mm-yyyy –

回答

1

可能的解決辦法:

foreach (DataRow row in ds.Tables[0].Rows) 
{ 
    DateTime effectiveDateFrom; 
    DateTime effectiveDateTo; 

    if (!DateTime.TryParse(row["Effect_Date_From"], out effectiveDateFrom) 
     effectiveDateFrom = DateTime.MinValue; 

    if (!DateTime.TryParse(row["Effect_Date_To"], out effectiveDateTo) 
     effectiveDateTo = DateTime.MinValue; 

    row["Effective_Period"] = effectiveDateFrom.ToString("dd/MM/yyyy") + " - " + effectiveDateTo.ToString("dd/MM/yyyy"); 
} 
+0

謝謝,這是一個完美的解決方案:) – RedRocket

+0

那麼,爲什麼你刪除了回答標誌? –

+0

噢,對不起,我按錯了按鈕,沒有意識到這 – RedRocket

0

您可能要反映的DateTime定義你的C#表示可爲空的選項:

Nullable<DateTime> value; 
// or 
DateTime? value; 

兩種形式是等同的。

Ofcourse,在C#中的值工作時,你必須定義什麼就做null,你不能依靠一些魔法null.ToString()爲您轉換。

您可能還想看看this question。精華:使用row.Field<DateTime?>("Effect_Date_From")從數據行中獲得可空的DateTime

0

如果您想允許NULL,請在您的數據庫表中將該字段設置爲NULLABLE。然後它將允許插入NULL值,而不會有任何問題。另外,如果您希望允許顯示某個值,則必須將該字段設置爲nvarchar,因爲此字段不會被識別爲有效DateTime

另一個重要的注意事項是,不是像這樣存儲,而是可以輕鬆地爲起始時間段創建兩個單獨的列,並分別在兩個值中存儲DateTime值。這也可以讓您根據所需日期查詢數據和過濾數據。

UPDATE:

你也會,如果你傳遞一個NULL,並使用.ToString()收到此異常。所以請確保你使用.ToString()之前在這裏傳遞一些東西,比如日期或字符串。而在後端,您可以根據需要修改數據類型。

這裏要做的一件好事是在使用.ToString()轉換之前執行空檢查。如果爲空,則可以直接通過null,如果不存在,則可以轉換該值,然後傳遞該值。

希望這會有所幫助。

+0

在OP的代碼中,他試圖對空值進行操作。 ToString()。 – NPToita

0

嘗試:

foreach (DataRow row in ds.Tables[0].Rows) 
      { 
       bool fromIsNull = DBNull.Value.Equals(row["Effect_Date_From"]); 
       bool toIsNull = DBNull.Value.Equals(row["Effect_Date_To"]); 
       row["Effective_Period"] = (fromIsNull ? string.Empty : Convert.ToDateTime(row["Effect_Date_From"].ToString()).ToString("dd/MM/yyyy")) 
        + (fromIsNull || toIsNull ? string.Empty : " - ") 
        + (toIsNull ? string.Empty : Convert.ToDateTime(row["Effect_Date_To"].ToString()).ToString("dd/MM/yyyy")); 
      } 

更新的代碼,以適應你的最後評論。這就是你如何隱藏/顯示「 - 」。但這完全取決於你如何處理案件。

+0

您好我已經試過你的方法,它說不能轉換字符串中的代碼'Convert.ToDateTime該塊爲bool(行[「Effect_Date_From」]。的ToString())。 ToString(「dd/MM/yyyy」)+「 - 」+ DBNull.Value.Equals(行[「Effect_Date_To」])' – RedRocket

+0

更新了代碼部分。我錯過了操作優先級的幾個括號。 – NPToita

+0

我明白了,謝謝你的幫助。見基斯爲正確答案:) – RedRocket

0

Null沒有ToString()函數,所以如果你期望結果爲null,你必須確保你不會調用它的函數。

相關問題