2011-03-15 60 views
4

我有用C#編寫的asp.net窗體,我正在通過使用Linq將用戶信息插入到數據庫中。好。因爲我正在從用戶那裏獲取出生日期,但是如果用戶跳過從UI填充日期文本框,那麼我會得到像'01/01/0001'這樣的日期,這肯定是數據庫安全性不允許的存儲它。在.NET中處理空日期的標準方法是什麼

所以我需要檢查我的代碼中的某個地方,它是空的或以這種(上面給出的)格式。如果它爲空或格式爲'01/01/0001',那我到底要做什麼?我沒有任何日期的默認 值。

那麼如果日期爲空(但不是強制性的),那麼標準的處理方式是什麼?請引導我。很多時候,我發現自己處於陷阱中,而處理各種類型的null。

編輯 看到我所做的似乎它在這裏工作。但我不這麼認爲這是標準的方式:

DateTime? otxtDOB = new DateTime(); 
        if (!string.IsNullOrEmpty(DOB)) 
        { 
        if (Convert.ToDateTime(DOB) != DateTime.MinValue) 
         { 
         otxtDateOfPurchese = Convert.ToDateTime(Convert.ToDateTime(DOB).ToString("dd-MMM-yyyy")); 
         } 
        else 
        { 
        otxtDOB = null; 
         } 

        } 

請確認我是這種正確的方式嗎?

+0

我只能說DateTime? dt = null; – 2011-03-15 09:36:16

+0

不用我在這裏用過DateTime not DateTime? – 2011-03-15 09:45:13

+0

這是非常古老的日期時間只是一個小丑'?'被添加來使其可以爲空,即接受空值。 – 2011-03-15 09:59:16

回答

-3

傳遞到數據庫時可以使用它。

object datetimeObj = null; 
if (datetimefromUI == DateTime.MinValue) // This is put in the DateTime object by default 
    datetimeObj = DBNull.Value; 
else 
    datetimeObj = datetimefromUI; 

// Post datetimeObj to parameter in database... 
+2

C#有空,應該用它們代替。 – 2011-03-15 09:34:42

10

製作日期財產Nullable(即一個「DateTime?」),應該允許它實際上是空,如果用戶沒有設置它。 (並提供您的數據庫列將允許空值,它可以存儲爲空的數據庫)

否則它將默認爲DateTime.MinValue這就是你在這裏看到的。添加到數據庫時,您必須明確測試DateTime.MinValue

1

DateTime是一個值類型(像一個數字),所以你不能給它賦值爲空值。鬃人使用DateTime.MinValue或DateTime.MaxValue代替,但我更喜歡使用可空類型:

DateTime? nullableDate; 
dateSample.Value = null; 
+0

但因爲我試圖給空值分配日期時間我得到異常爲:\t條件表達式的類型無法確定,因爲'System.DateTime'和''之間沒有隱式轉換爲什麼要這樣? – 2011-03-15 09:40:23

+0

看到這一行:DateTime? dt = Convert.ToDateTime(DOB)!= DateTime.MinValue? Convert.ToDateTime(DOB):null;這是正確的代碼還是錯誤? – 2011-03-15 09:42:55

+0

我認爲問題出在您的條件句子中。嘗試傳統的if-else條件檢查是否有任何轉換爲​​datetime?是必要的。 – Jonathan 2011-03-15 10:14:09

0

你必須使用Nullable<DateTime>(化名DateTime?)的選項。這使您可以在整個應用程序中將日期處理爲空。

但是,我個人不會發現空數,並且更喜歡第二條路徑:您可以在您的應用程序中使用DateTime.MinValue(即01/01/0001)作爲有意義的常數,並在您的應用程序中檢查DateTime.MinValue數據訪問層。

如果您嘗試保存DateTime.MinValue,數據庫(如果它是SQL Server並且字段類型爲smalldatetime)會溢出並引發異常。但是,Null很可能存儲在數據庫中的任何類型。

這是你如何解析你的字符串轉換爲可空類型:

private delegate bool TryParseDelegate<T>(string s, out T t); 
private static T? TryParseNullable<T>(string s, TryParseDelegate<T> tryParse) where T : struct 
{ 
    if (string.IsNullOrEmpty(s)) 
     return null; 
    T t; 
    if(tryParse(s, out t)) 
     return t; 
    return null; 
} 

與用法:

var nullableDateTime = TryParseNullable<DateTime>("01/01/0001", DateTime.TryParse); 
+0

但因爲我試圖給空值分配日期時間我得到異常爲:條件表達式的類型無法確定,因爲沒有'System.DateTime'和''之間的隱式轉換爲什麼要這樣? \t 看到下面這行:DateTime? dt = Convert.ToDateTime(DOB)!= DateTime.MinValue? Convert.ToDateTime(DOB):null;這是正確的代碼還是錯誤? – 2011-03-15 09:47:44

+0

由於DateTime是一個_value type_,它不能爲空。因此,您不能在條件表達式中將Convert.ToDateTime()方法和null一起使用。在這種情況下,「DOB」是什麼?一個字符串? – 2011-03-15 10:02:43

+0

是的,DOB是字符串。如果我不能解釋的東西,那麼同樣的標準是什麼?任何代碼參考 – 2011-03-15 10:04:14

0

你可以做一些這樣的事C#有像可空類型,你可以做一些功能使用 這樣它會爲你節省一些代碼,它也會更加健壯。

Public int InsertData(int? ouId) 
{ 

chkValue = ouId.HasValue ? ouId.Value : 0; 
} 
+0

我想我的關於DateTime的問題。我知道可以空,因爲所有人都給我答覆。但我不確定如何更改日期格式? – 2011-03-15 10:19:11

0

使用

DateTime dt; 
if(DateTime.TryParse(DatetImeValue.Tostring(),dt)) // datetimevalue is your db value 
{ 
    datetimeproperty = dt; // in your class declare it as DateTime? datetimeproperty 
} 
else 
{ 
    datetimeproperty = null; 
} 

當顯示檢查是否爲空,如果空集是空的。

[更新]

做一兩件事,保持房地產空。在你的數據庫中。將字段設置爲允許null,並在參數user @DateTimeParam = null中。

或快速替代方法使數據庫技術領域與參數VARCHAR DATETIME INSTEAD OF,IN參數傳遞DATETIMEVALUE.TOSHORTDATESTRING(),並且也檢查用戶是否跳過PARAMETER PUT的String.Empty。以這種方式,它很容易讓你顯示日期和時間。你不需要鑄造或擦掉時間部分,如果你不需要它

0
obj.BirthDate = Convert.ToDateTime(string.IsNullOrEmpty(txtBirthDate.Text.ToString()) ? System.Data.SqlTypes.SqlDateTime.MinValue.Value : Convert.ToDateTime(txtBirthDate.Text.ToString())); 
相關問題