将 datetime2 数据类型转换为 smalldatetime 数据类型会导致值超出范围. 语句已终止

本文关键字:范围 语句 终止 类型转换 数据 datetime2 smalldatetime 数据类型 | 更新日期: 2023-09-27 18:33:20

我做了一个小的MVC4应用程序,并在本地SQL 2012服务器上做了数据库。从我的 2012 年"导入"了这些数据,并将其作为 SQL 2008 的生产环境移动到我的廉价共享主机。一切正常。对非 ASP成员资格表进行了一些更改,并从 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

如果我尝试注册一个帐户。 我尝试将所有小日期时间列追逐到 datetime2 列,但由于某种原因,即使没有小日期时间,也会发生同样的错误?

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

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

将 datetime2 数据类型转换为 smalldatetime 数据类型会导致值超出范围.
语句已终止

从错误的外观来看,您的数据库正在使用 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,因此您将收到问题中显示的错误。

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

  • 使字段为空。(您必须始终检查输入日期是否在小日期时间范围内。

  • 或在 SQL 服务器中将日期类型更改为 DateTime2

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


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

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

希望我已经正确理解了您的问题,我的答案会有所帮助。