【.NET】SqlDateTime 溢出。必須介於 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之間


#背景

  向sqlserver數據庫中一個datetime字段插入DateTime.MinValue時,

  出現問題:

    SqlDateTime 溢出。必須介於 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之間

 

#錯誤原因

  當傳給數據庫的時間類型的值為NULL,或者為DateTime.MinValue時,插入或者更新數據庫時,datetime字段值會默認插入0001年01月01日造成datetime類型溢出。

  這里的NULL指的是程序代碼里面的null,大多數出現這種情況的情景是:在程序里面定義了一個時間類型的變量,沒有給賦值,就傳給數據庫了。這時這個變量的值默認是賦成了01年01月01日。

  由於數據庫中DateTime類型字段,最小值是1/1/1753 12:00:00,而.NET Framework中,DateTime類型,最小值是1/1/0001 0:00:00,顯然,超出了sql的值的最小值范圍,導致數據溢出錯誤。

  通過C#看.net和sql的最大小時間:

 1 DateTime t=new DateTime();
 2 DateTime t1 = DateTime.MinValue;
 3 DateTime t2 = DateTime.MaxValue;
 4 DateTime t3 = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
 5 DateTime t4 = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue;
 6 Console.WriteLine(".net中DateTime默認值{0}", t);
 7 Console.WriteLine(".net最小時間為{0}", t1);
 8 Console.WriteLine(".net最大時間為{0}", t2);
 9 Console.WriteLine("SQL最小時間為{0}", t3);
10 Console.WriteLine("SQL最大時間為{0}", t4);

  輸出效果:

#解決方法

 

1、確保Datetime類型變量賦值后,再向數據庫更新數據;

2、如果數據庫中數據類型為Datetime,如果想插入最小值,那在程序中使用System.Data.SqlTypes.SqlDateTime.MinValue替代System.DateTime.MinValue,這樣SqlDateTime的MinValue和Sql中DateTime的范圍吻合,就不會再出現以上的錯誤了。也可以將數據庫中的Datetime類型修改為Datetime2類型,這樣使用System.DateTime.MinValue就不會出現超出范圍的情況了;

3、通常情況下,我們不在日期字段里存入空值.當沒有日期值時存入'1900-1-1',這個叫做默認時間值。在讀取數據的時候,遇到1900-1-1就認為數據庫該時間字段沒有值;

insert into 表名 (Datetime字段名) values (cast(nullif('程序中傳入的時間類型變量','')) as DateTime)

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM