zoukankan      html  css  js  c++  java
  • 【.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)


  • 相关阅读:
    数据库插入
    c#里面调用python
    抓取最好大学网
    selenium抓取慕课课程
    excel合并
    网页抓取
    pyinstaller打包报错
    获取微信联系人
    c#部分类
    C#只读属性
  • 原文地址:https://www.cnblogs.com/willingtolove/p/9209377.html
Copyright © 2011-2022 走看看