【问题标题】:SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PMSqlDateTime 溢出。必须介于 1753 年 1 月 1 日上午 12:00:00 和 9999 年 12 月 31 日晚上 11:59:59 之间
【发布时间】:2012-02-23 15:01:52
【问题描述】:

我在数据库中有订阅者表,其中包含具有默认值 GetDate() 的 DateCreate 字段。 当我尝试通过实体框架向表中添加新记录时:

        Subscribers subs = new Subscribers();
        subs.Email = email;
        subs.DateCreate = DateTime.Now;
        DataBase.DBContext.AddToSubscribers(subs);
        DataBase.DBContext.SaveChanges();

它抛出一个异常: SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。

谁能帮帮我? 谢谢。

【问题讨论】:

  • 这是您交易中唯一的Date 属性吗?代码看起来不错
  • 订阅者类中定义的其他字段是什么?如果有 DateTime,它们是否可以为空?
  • 是的,那里还有另一个可为空的 DateTime 字段

标签: asp.net database entity-framework


【解决方案1】:
  1. 确保您的机器时钟不是 15 世纪 ;-)
  2. 重新创建您的模型。
  3. 如果您的表格有默认值,您不必在代码中设置它。
  4. 考虑使用GETUTCDATE() 而不是GETDATE()
  5. 确保没有其他 DateTime 字段没有默认值。

【讨论】:

  • 是的,那里还有另一个可以为空的 DateTime 字段是什么?
  • 确保您的属性类型为DateTime? 而不是DateTime。在后一种情况下,DateTime.MinValue 将被插入到表中,导致异常。 MinValue 早于 1753 年...
  • 嗯,如果模型是自动生成的,我该怎么做?
  • 如果其他属性不是 DateTime?,那么您的列可能不能为 NULL。验证它。此外,您可能希望发布您的表架构和生成的实体。
  • 是的,其他属性是 DateTime 也是因为我什至无法设置 DateTime?任何属性的类型。 DateCreate 不可为空...不是愚蠢的框架吗?
【解决方案2】:

这是一个迟到的答案,但我刚才遇到了同样的问题。出现此问题的原因是您的实体中有另一个日期,其默认值 (MinValue) 将为 1/1/0001。在 SQL/Server 中,默认值 (MinValue) 是 1/1/1753 之类的。

我在 vfstech.com 找到了一篇帮助我的好文章,它建议在数据库中使用 datetime2 而不是 datetime,但这对我来说不是一个选择。但是,它也有可以双向翻译的代码。我很快创建了一个从我的实体类继承的类,并在我的应用程序中使用它,它很好地解决了我的问题,而我不必用我认为微软应该从一开始就正确实施的东西感染我的业务逻辑。

【讨论】:

    【解决方案3】:

    如果您在.Net 代码中使用Convert.ToDateTime(),请检查应用程序托管服务器的日历设置,主要是时区和短日期格式

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多