【问题标题】:The conversion of a datetime2 data type to a smalldatetime data type resulted in an out-of-range value.\r\nThe statement has been terminated [duplicate]将 datetime2 数据类型转换为 smalldatetime 数据类型导致值超出范围。\r\n语句已终止 [重复]
【发布时间】:2012-05-04 06:19:06
【问题描述】:

我制作了一个小型 MVC4 应用程序,并在我的本地 SQL 2012 服务器上制作了数据库。 “导入”了我 2012 年的数据,将其作为 sql 2008 的生产数据转移到我的廉价共享主机中。一切正常。对非 aspmembership 表进行了一些更改,并从 sql 2008 中删除了表并重新导入。 不是出于某种原因我收到此错误

The conversion of a datetime2 data type to a smalldatetime data type resulted in an out-of-range value.\r\nThe statement has been terminated

如果我尝试注册一个帐户。我尝试将所有 smalldatetimecolumns 更改为 datetime2 列,但由于某种原因,即使没有 smalldatetimes,也会出现相同的错误?

有人有什么想法吗?谢谢。

编辑:未来的人 - 我不确定为什么要修复它,但我在 SQL express 2008 而不是 SQL 2012 中重新创建了表,然后将它们移动了过去。工作正常。

【问题讨论】:

标签: c# asp.net-mvc sql-server-2008


【解决方案1】:

从错误的外观来看,您的数据库使用 SmallDateTime 作为日期类型。它的最小值是 1900-Jan-01。假设您的实体如下所示

  public class Game
  {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid GameId { get; set; }

    [Required]
    public DateTime GameTime { get; set; }
  }

您的 GameTime 值不可为空,因此当您不为其设置任何值时,它将始终是 DateTime.Min,即 0000-Jan-01。这超出了 SmallDateTime 的范围,但在 DateTime2 的范围内。因此 EF 将尝试将 DateTime2 SQL 类型传递给 SQL 服务器。因为您的数据库使用的是 SmallDateTime,所以您会收到问题中显示的错误。

要解决此问题,我可以想到以下选项:

  • 使该字段为空。 (您必须始终检查您的输入日期是否在 SmallDateTime 范围内。)

  • 或者在SQL server中将日期类型改为DateTime2

  • 或强制 EF 在创建数据库时使用 DateTime2 数据类型。代码将如下所示。 (这个方法应该在你的上下文类中。)


  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(t => t.GameTime )
            .HasColumnType("datetime2");
    }
  • 编写转换器助手来设置您的 DateTime 属性最小值以匹配应用程序中的 smalldatetime。

  • 在数据库中编写一个触发器,将 DateTime2(来自应用程序端,但 datetime2 在数据库端)转换为 smalldatetime。

希望我已经正确理解了您的问题,并且我的回答对您有所帮助。

【讨论】:

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