将datetime2数据types转换为date时间数据types会导致超出范围的值
我有一个5列的数据表,其中一行正在填充数据,然后通过事务保存到数据库。
在保存时,将返回一个错误:
将datetime2数据types转换为date时间数据types会导致超出范围的值
它意味着,如所读,我的数据表有一个DateTime
types和我的数据库DateTime
; 那是错的。
date列被设置为这样的date时间:
new DataColumn("myDate", Type.GetType("System.DateTime"))
题
这可以通过代码来解决,还是需要在数据库级别上进行更改?
你在这个专栏里有什么样的date?
是否所有这些都符合这个范围?
另外,为DataColumn
构造函数获取Type
对象的正确方法是typeof
关键字,它的速度要快上typeof
数量级。
因此,要创build列,你应该写
new DataColumn("myDate", typeof(DateTime))
如果在字段不接受NULL值时不为DateTime字段赋值,则会发生这种情况。
为我修好了!
DATETIME
和DATETIME2
映射到.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的datetime2
types的选项
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
– >然后
- select实体和date时间属性
- select
StoreGeneratedPattern
- 设置为
Computed
其他答案是变通方法,因为列的目的是在创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
entity framework4与datetime2数据types一起工作,所以在db中,相应的字段必须是SQL Server 2008的datetime2。
为了达到解决scheme有两种方法。
- 要在Entity Framwork 4中使用date时间数据types,您必须将edmx-file中的ProviderManifestToken切换为“2005”。
- 如果将相应的字段设置为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。
下面是一个不完整的DateTime到DateTime的真实生活的例子? 引起奇怪行为的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。