将datetime2数据types转换为date时间数据types会导致超出范围的值

我有一个5列的数据表,其中一行正在填充数据,然后通过事务保存到数据库。

在保存时,将返回一个错误:

将datetime2数据types转换为date时间数据types会导致超出范围的值

它意味着,如所读,我的数据表有一个DateTimetypes和我的数据库DateTime ; 那是错的。

date列被设置为这样的date时间:

new DataColumn("myDate", Type.GetType("System.DateTime"))

这可以通过代码来解决,还是需要在数据库级别上进行更改?

你在这个专栏里有什么样的date?

是否所有这些都符合这个范围?


另外,为DataColumn构造函数获取Type对象的正确方法是typeof关键字,它的速度要快上typeof数量级。

因此,要创build列,你应该写

 new DataColumn("myDate", typeof(DateTime)) 

如果在字段不接受NULL值时不为DateTime字段赋值,则会发生这种情况。

为我修好了!

DATETIMEDATETIME2映射到.NET中的System.DateTime – 你不能真正做一个“转换”,因为它是真正的.NETtypes。

请参阅MSDN文档页面: http : //msdn.microsoft.com/en-us/library/bb675168.aspx

这两个“ SqlDbType ”有两个不同的值 – 你可以在DataColumn定义中指定那些值吗?

但是:在SQL Server上,支持的date范围是完全不同的。

DATETIME支持1753/1/1“永恒”(9999/12/31),而DATETIME2支持0001/1/1永恒。

所以你真正需要做的是检查date的年份 – 如果在1753年之前,你需要将它改为1753年之后的东西,以便SQL Server中的DATETIME列能够处理它。

渣子

在我的SQL Server 2008数据库中,我有一个标记为不可空的DateTime列,但有一个GetDate()函数作为其默认值。 当使用EF4插入新对象时,我得到了这个错误,因为我没有明确地在我的对象上传递一个DateTime属性。 我期望的SQL函数来处理我的date,但事实并非如此。 我的解决scheme是从代码发送date值,而不是依靠数据库来生成它。

 obj.DateProperty = DateTime.now; // C# 

对我来说是因为date是…

01/01/0001 00:00:00

在这种情况下,您希望为您分配空EF EF DateTime对象…使用我的FirstYearRegistered代码作为示例

 DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]); if (FirstYearRegistered != DateTime.MinValue) { vehicleData.DateFirstReg = FirstYearRegistered; } 

这个让我疯狂。 我想避免使用可空的date时间( DateTime? )。 我没有使用SQL Server 2008的datetime2types的选项

 modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2"); 

我最终select了以下内容:

 public class MyDb : DbContext { public override int SaveChanges() { UpdateDates(); return base.SaveChanges(); } private void UpdateDates() { foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>()) { var values = change.CurrentValues; foreach (var name in values.PropertyNames) { var value = values[name]; if (value is DateTime) { var date = (DateTime)value; if (date < SqlDateTime.MinValue.Value) { values[name] = SqlDateTime.MinValue.Value; } else if (date > SqlDateTime.MaxValue.Value) { values[name] = SqlDateTime.MaxValue.Value; } } } } } } 

有时EF不知道正在处理计算列触发器 。 按照devise,这些操作将在插入后在EF外设置一个值。

解决方法是在StoreGeneratedPattern属性中为该列指定在EF的edmx Computed

对于我来说,当列有触发器插入当前的date和时间,见下面的第三部分。


步骤来解决

在Visual Studio中打开Model Browser页面,然后打开Model然后selectEntity Types – >然后

  1. select实体和date时间属性
  2. selectStoreGeneratedPattern
  3. 设置为Computed

EF模型浏览器模型实体类型对话框


其他答案是变通方法,因为列的目的是在创buildlogging时指定一个时间/date,这就是SQL执行触发器以添加正确时间的工作。 比如这个SQL触发器:

DEFAULT (GETDATE()) FOR [DateCreated]

最简单的事情是将数据库更改为使用datetime2而不是datetime。 兼容性很好,你不会得到你的错误。

你仍然想做一堆testing…

这个错误可能是因为你想把date设置为0或者什么 – 但是这一切都取决于你有什么控制来改变东西。

我碰到这个,并添加到我的date时间属性如下:

  [Column(TypeName = "datetime2")] public DateTime? NullableDateTimePropUtc { get; set; } 

我发现这个post试图找出为什么我不断收到下面的错误,这是由其他答案解释。

将datetime2数据types转换为date时间数据types会导致超出范围的值。

使用一个可空的DateTime对象。
公共DateTime? PurchaseDate {get; 组; }

如果您正在使用entity framework将edmx文件中的可空属性设置为True

将edmx文件中的可空属性设置为** True **

entity framework4与datetime2数据types一起工作,所以在db中,相应的字段必须是SQL Server 2008的datetime2。

为了达到解决scheme有两种方法。

  1. 要在Entity Framwork 4中使用date时间数据types,您必须将edmx-file中的ProviderManifestToken切换为“2005”。
  2. 如果将相应的字段设置为Allow Null(将其转换为NULLABLE),那么EF将自动使用date对象作为date时间。

基于@ sky-dev实现创build一个基类。 所以这可以很容易地应用到多个上下文和实体。

 public abstract class BaseDbContext<TEntity> : DbContext where TEntity : class { public BaseDbContext(string connectionString) : base(connectionString) { } public override int SaveChanges() { UpdateDates(); return base.SaveChanges(); } private void UpdateDates() { foreach (var change in ChangeTracker.Entries<TEntity>()) { var values = change.CurrentValues; foreach (var name in values.PropertyNames) { var value = values[name]; if (value is DateTime) { var date = (DateTime)value; if (date < SqlDateTime.MinValue.Value) { values[name] = SqlDateTime.MinValue.Value; } else if (date > SqlDateTime.MaxValue.Value) { values[name] = SqlDateTime.MaxValue.Value; } } } } } } 

用法:

 public class MyContext: BaseDbContext<MyEntities> { /// <summary> /// Initializes a new instance of the <see cref="MyContext"/> class. /// </summary> public MyContext() : base("name=MyConnectionString") { } /// <summary> /// Initializes a new instance of the <see cref="MyContext"/> class. /// </summary> /// <param name="connectionString">The connection string.</param> public MyContext(string connectionString) : base(connectionString) { } //DBcontext class body here (methods, overrides, etc.) } 

正如andyuk已经指出,当一个NULL值被分配给一个不可空的DateTime字段时,可能会发生这种情况。 考虑将DateTime更改为DateTime?可为空 < DateTime >。 请记住,如果您正在使用依赖项属性 ,还应该确保您的依赖项属性的types也是可以为空的DateTimetypes。

下面是一个不完整的DateTimeDateTime的真实生活的例子 引起奇怪行为的types调整

在这里输入图像描述

如果我们不通过一个date时间date时间字段默认date{1/1/0001 12:00:00 AM}将被传递。

但是这个date与entity framework工作不兼容,所以它会将datetime2数据types转换为导致超出范围的值的datetime数据types

如果您没有传递任何date,只需将default DateTime.now为date字段即可。

 movie.DateAdded = System.DateTime.Now 

在我的情况下,我们将date投射到date时间,我们得到这个错误。 会发生什么是date有一个“更多程序员导向”最低01/01/0001,而date时间卡住在1753年

结合我们的数据收集错误,你得到你的exception!

有时它在开发机器上而不是在服务器上工作正常。 在我的情况下,我不得不说:

 <globalization uiCulture="es" culture="es-CO" /> 

在web.config文件中。

机器(服务器)中的时区是正确的(对于CO语言环境),但是Web应用程序没有。 这个设置完成,它再次正常工作。

当然,所有date都有价值。

:d

你将有一个date列被设置为允许数据时间的最小值,比如1/1/1001。

为了克服这个问题,你可以设置合适的date时间值为你的属性,也可以设置另一个神奇的属性,如IsSpecified = true。