一个DATETIME2数据类型到SMALLDATETIME数据类型的转换导致外的范围内的值。\\ř\

2019-09-17 00:38发布

这个问题已经在这里有一个答案:

  • 一个DATETIME2数据类型为datetime数据类型的转换导致的外的范围? 4个回答

我做了一个小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

如果我尝试注册一个帐号。 我试图chaning所有smalldatetimecolumns到DATETIME2列,但由于某种原因,即使没有smalldatetimes发生同样的错误?

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

编辑:未来的人 - 我不清楚为什么这种固定的,但我在重新创建SQL表表示2008年而不是2012 SQL,然后感动他们。 工作得很好。

Answer 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,你会得到你的问题所示的错误。

要解决此问题,你有我能想到的下列选项:

  • 使现场nullalbe。 (你要经常检查,如果你的输入日期是SMALLDATETIME范围内。)

  • 或更改日期类型DATETIME2在SQL服务器

  • 或强制EF创建数据库时使用DATETIME2数据类型。 该代码就会像下面的东西。 (此方法应该内的上下文类的。)


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

  • 写一个触发器在数据库中DATETIME2转换(从申请结束,但DATETIME2在数据库端)为smalldatetime。

希望我已经正确理解你的问题,我的回答帮助。



文章来源: 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]