将datetime2数据类型转换为smalldatetime数据类型会导致超出范围的值。\ r \ n该语句已终止

时间:2012-05-04 06:19:07

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

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

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中重新创建表,然后将它们移动过来。工作得很好。

1 个答案:

答案 0 :(得分:12)

从错误的角度看,您的数据库使用SmallDateTime作为日期类型。它的最小值是1900年1月1日。假设您的实体如下所示

  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,因此您将收到问题中显示的错误。

要解决此问题,您可以考虑以下选项:

  • 让这个领域成为nullalbe。 (您必须始终检查输入日期是否在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。

希望我能正确理解你的问题,我的回答会有所帮助。