【问题标题】:How to fix "SqlException: The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value."如何修复“SqlException:将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。”
【发布时间】:2012-05-16 18:09:09
【问题描述】:

SqlException:将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。

我的代码是这样的:

        using (var contxt = new realtydbEntities())
        {
            var status = GetStatus();

            var repIssue = new RepairIssue()
            {
                CreaterId = AuthorId,
                RepairItemDesc = this.txtDescription.Text,
                CreateDate = DateTime.Now,//here's the problem
                RepairIssueStatu = status
            };

            contxt.AddObject("RepairIssues", repIssue);
            contxt.SaveChanges();
        }

CreateDate 属性映射到类型为 smalldatetime 的列。

如何让这段代码运行?

【问题讨论】:

标签: c# asp.net entity-framework webforms


【解决方案1】:

我有同样的例外,但这是因为一个不可为空的日期时间属性采用了最小日期时间值。这不是 DB 的 smalldatetime,而是 C# 的 min datetime 超过了 SQL 的 min datetime 的限制。 解决方案很明显,正确设置日期时间。 顺便说一句,代码不是我的,这就是为什么我不知道该属性:)

【讨论】:

  • 你是如何正确设置日期时间的?
【解决方案2】:

问题的根源在于 C# DateTime 对象比 SQL 的 smalldatetime 类型“大”。以下是对差异的简要概述:http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes

所以你的选择是:

  1. 将列类型从 smalldatetime 更改为 datetime(或 datetime2)
  2. 不使用 EF,而是构建自己的 SQL 命令(也可以使用 SqlDateTime)

【讨论】:

  • 这并不能解释为什么 DateTime.Now will 不适合 SmallDateTime。与其说是大小,不如说是它可以存储的范围和精度/准确度。 DateTime.Now 应该始终是 SmallDateTime 字段的有效值(除非您将 PC 时钟设置回 300 年),但是我目前在尝试简单地保存 {04/ 的“DateTime.Now”值时遇到完全相同的错误10/2013 12:49:00} 到 SQL SmallDateTime 字段中。令人沮丧的是,我在 SO 的任何地方都找不到正确的答案。
  • @TrueBlueAussie 不允许从“较大”类型自动转换为“较小”类型,因为在转换过程中可能会丢失信息。无论“更大”意味着“可以容纳更大的数字”还是意味着“可以容纳更高的精度”,这同样是正确的。 C# 假定这些小数秒很重要,除非您明确说明它们不重要(例如,使用显式转换)。
  • @GrandOpener:对不起,您误解了我的评论。我只是说答案应该解释为什么 dateTime.Now 不适合 SmallDateTime。我不是在要求解释:)
【解决方案3】:

将此添加到您的模型类中:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
    }

【讨论】:

    【解决方案4】:

    SqlDateTime 将允许您做您需要做的事情。

    【讨论】:

    • 如果您按照您的建议从DateTime 创建SqlDateTime,然后将其Value 用于EF 更新(因为EF 属性是DateTime)您仍然会得到完全相同的错误(如果你有这个错误)。除非您能阐明这是如何解决问题的,否则此答案对于 EF(问题所在)似乎不正确。
    【解决方案5】:

    我收到此错误是因为我在我的 SQL 表和应用程序中添加了一个日期时间列,而没有删除旧数据。我发现我可以更新新记录;但是,当尝试更新其中一个字段时,表中添加字段之前的记录会引发此错误。

    【讨论】:

      【解决方案6】:

      检查您的迁移内容。我这样改变了我的模型”

      公共日期时间?创建日期 { 获取;放; }

      然后添加新的迁移,最后运行更新数据库

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-07
        • 2011-11-15
        • 2010-11-22
        相关资源
        最近更新 更多