簡體   English   中英

C#,WCF和DateTime.MinValue()與Null Date

[英]C#, WCF and DateTime.MinValue() vs. Null Date

我已經四處搜索但尚未找到令人滿意的答案:

概述:我正在開發一個小應用程序,它使用WCF將多個DateTime字段用於單個表。 我們正試圖消除所有表中的空字段。 到目前為止,每當我們轉換從表中選擇的日期時間字段時,我們首先在顯示或“使用”它之前驗證它是否為空。 如果值為NULL,我們將DateTime.MinValue替換為值。 由於我們現在正在刪除所有字段的可空方面,我們需要插入一個表示null的公共值; 因為DateTime.MinValue()在代碼中的每個地方被替換,所以作為空替換放入字段似乎是一個可行的值。

問題:插入DateTime.MinValue()會導致通用“執行此請求時出現問題”錯誤。

解? :正如其他地方所記載的那樣, DateTime.MinValue()有一個未指定的DateTimeKind所以...我們添加ToUniversalTime調用,如:

DateTime nullDate = DateTime.MinValue.ToUniversalTime(); // 1/1/0001 6:00:00 AM

這不起作用,可能是因為在WCF上的日期轉換中有一些“可接受的范圍”設置?

注釋中注明的是“1/1/0001 6:00 am”的結果值。 奇怪的是早上6點或一年“1”,這似乎很好。 (考慮到過去的默認年份,比如1970年代上午12:00仍然是相當標准的,但我離題了...)

是的,我知道DateTime不是C#,它是.NET。 我也知道WCF在其轉換限制內允許某種形式的“min”和“max”次。 我不知道如何設置它們(我也不知道如何設置VerboseMessages位;我對WCF很新。)

手動創建一個可以很好地轉換為表的新字段值的建議是可行的,它可以工作:

DateTime nullDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

(順便說一句,如果我們使用第1年而不是1970年(例如),插入也將失敗。)

即使我們使用上面的nullDate作為可行的替代品......問題是代碼中的任何地方我們仍然在針對表示空日期的DateTime.MinValue()評估,並且這兩個日期並不完全相同。

我能想到的唯一可行的解​​決方案是覆蓋或以其他方式從DateTime創建擴展類以創建公共NullDate並相應地修改所有代碼。

有沒有人看到一個很好的選擇? 有沒有人知道將System.DateTime.MinValue()插入WCF表的解決方案,例如更改好/壞日期的可接受邊界?

我覺得我必須咬緊牙關並改變對MinValue的所有引用......我試圖避免這種情況,因為它在評估“默認”值時沒有遵循任何標准的邏輯思想。

有人建議嗎?

它取決於您用於存儲數據的數據庫。 例如,SQL Server的最小日期為1/1/1753,請參閱MSDN 我不確定Oracle。

如果你必須使用魔法日期,你可以使用它或其他特定的東西(我使用1815年12月10日,以紀念第一個程序員Lady Ada Lovelace)。 一般來說,如果您遇到沒有已知值的情況,則數據存儲應將值表示為“null”。 現在在實踐中,這並不總是可行的。 您可以做的是將可空列重構為子表,並且只有當您實際上有要記錄的內容時才包含子記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM