1. 程式人生 > >"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value

"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value

這句話的意思是將datetime2資料型別轉換為datetime資料型別會導致超出範圍的值。宣告已經終止。
在使用EF插入資料是發生列轉換的錯誤,搞了好久,不知道問題出在哪裡!
根據提示的錯誤資訊來看是Datetime資料型別出現錯誤
後來發現

 public Nullable<System.DateTime> NextCMDateTime { get; set; }
 public System.DateTime AddDateTime { get; set; }

上面兩句有一點點不同
經過測試發現在C#中的DateTime型別是sqlsever中的dateTime2
DateTIme? 才是sql中datetime
需要注意的是:C#中DateTime既datetime2型別不能為空! 其預設值是0000:00:00(大概),超出了資料庫中dateTime的範圍
因此,當C#中未對DateTime 賦值時,預設值是0000:00:00(而不是Null) 這樣寫入資料庫就會出現上面的的錯誤!(感覺微軟在這埋了個大坑!)

解決辦法:
將對C#中DateTime 賦值,不要使用資料庫的Default(GetNow()) 來賦值

PS: 使用EF插入數時,資料庫表中的default()已經如同虛設,最好所有的資料全都自己插入
eg:

ALTER TABLE [dbo].[EMS_AssetRegister] ADD  DEFAULT ('N/A') FOR [Approved]

表中對Approved 預設值為’N/A’
但是在EF中 對 Approved 未賦值,將資料插入後
資料庫中卻出現黃色標記的資料:
在這裡插入圖片描述
出現了Approved為null !
後來發現這樣等效於 insert into table (Approved),(null)

經過多方查詢資料,通過EF配置似乎可以解決問題,但是賊麻煩!
所以還是自己乖乖的為表中所有的default()賦值吧!
(EF真是大坑!)

有問題留言討論哈
可以參考下面博文:
https://www.cnblogs.com/choon/p/3951312.html