資料型別轉化之從 datetime2 資料型別到 datetime 資料型別的轉換
阿新 • • 發佈:2018-11-20
從 datetime2 資料型別到 datetime 資料型別的轉換產生一個超出範圍的值
最近在ASP.NET MVC中遇到一個問題,如題,在使用EF資料模型的時候,要去新增一條新的資料到Sqlserver資料庫,在之前專案中並沒有出現該異常,所以去扒了扒demo,發現有幾個欄位(資料庫型別為datetime)savechange的時候預設綁定了datetime.now。問題就在這裡,我的新專案並沒有給定這幾個欄位的資料。下面總結下:
觸發該錯誤的條件如下:
- SQL Server資料庫版本中的欄位型別為datetime2
- 資料庫中,某個要進行Add或者Edit的欄位的資料型別為datetime,比如表A中的today欄位,型別為datetime。而後臺程式碼進行資料庫操作時,並沒有給today(datetime型別)賦值。結果就是VS2015編譯的時候預設將其型別編譯為datetime2,導致用EF進行add和edit操作的時候出現該異常。
解決方案:
- 給這些欄位一個值(不管它是否在資料庫設定了預設值),並且日期要大於1753年1月1日,這是最簡單的方法。
- 將資料庫型別修改為datetime?型別,也就是說允許為空。
- 修改資料庫欄位型別為datetime2型別,前提是資料庫要支援該型別。
- 在C#中用new DateTime(year,month,day,hour,minute,second)來限制精度,原因之後會在datetime2和datetime的區別中提到。
- 這個方法不太推薦,將model的edmx中的providerManifestToken設定成2005,這樣ef就預設轉化成datetime。
datetime2和datetime的區別:
官方MSDN對於datetime2的說明:定義結合了 24 小時制時間的日期。 可將 datetime2 視作現有 datetime 型別的擴充套件,其資料範圍更大,預設的小數精度更高,並具有可選的使用者定義的精度。
這裡值的注意的是datetime2的日期範圍是"0001-01-01 到 9999-12-31"(公元元年 1 月 1 日到公元 9999 年 12 月 31 日)。
而datetime的日期範圍是:”1753 年 1 月 1 日到 9999 年 12 月 31 日“。這裡的日期範圍就是造成“從 datetime2 資料型別到 datetime 資料型別的轉換產生一個超出範圍的值”這個錯誤的原因。
1 2 3 4 5 |
|