将 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中重新创建了表,然后将它们移了过来。 工作正常。
从错误的外观来看,您的数据库正在使用 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。
希望我已经正确理解了您的问题,我的答案会有所帮助。