今天把一個使用了Entity Framework的程序從MySql遷移到SqlServer時,發現運行時報了一個異常:System.Data.SqlClient.SqlException: 從 datetime2 數據類型到 datetime 數據類型的轉換產生一個超出范圍的值。
在網上查找了一下,具體的錯誤原因是:C#中的DateTime類型比SqlServer中的datetime范圍大。SqlServer的datetime有效范圍是1753年1月1日到9999年12月31日,如果超出這個范圍,EF就會把datetime轉換為datetime2,但在數據庫的映射類型還是datetime類型,從而出現該異常。
也就是說,這個異常出現是有前提條件的:時間范圍在1753.1.1-9999.12.31外。知道這個原因后,解決的方案就有如下方式了:
-
將數據庫字段改為DateTime2類型
-
使程序的時間范圍維持在1753.1.1-9999.12.31內。
一般來說,正常情況下時間范圍是不會在sqlserver的datetime范圍之外的,我的程序中出現這個異常是因為有個時間類型的字段沒有初始化,維持在默認的時間0001.1.1。沒有對該字段初始化本身就不對,把該字段初始化后就不報異常了。