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

保存时,返回一个错误:

将datetime2数据类型转换为datetime数据类型会导致值超出范围

它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。

date列设置为DateTime,如下所示:

新数据专栏(“myDate, Type.GetType”)

问题

是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?


当前回答

检查DB中的req格式。例如我的DB有默认值或Binding (((1)/(1))/(1900))

System.DateTime MyDate = new System.DateTime( 1900 ,1, 1);

其他回答

实体框架4使用datetime2数据类型,因此在数据库中对应的字段必须是datetime2的SQL Server 2008。

要解决这个问题,有两种方法。

要在实体框架4中使用datetime数据类型,你必须将edmx文件中的ProviderManifestToken切换为“2005”。 如果你设置相应的字段为允许空(它转换为NULLABLE),那么EF自动使用日期对象作为datetime。

在我的例子中,我们将一个Date转换为一个Datetime,我们得到了这个错误。 结果是Date具有“更面向程序员”的最小值01/01/0001,而Datetime则停留在1753

将此与我们的数据收集错误结合起来,您就得到了异常!

看看下面两个: 1)该字段没有NULL值。例如:

 public DateTime MyDate { get; set; }

替换:

public DateTime MyDate { get; set; }=DateTime.Now;

2)重新创建数据库。例如:

db=new MyDb();

已经有很多好的答案了。我想展示一种使用实体框架core fluent api来解决这个问题的方法。 大多数情况下,错误发生在默认情况下生成DateTime值时,因此您需要覆盖DataContext中的OnModelCreating,并在您的特定实体的属性中手动添加默认值,以便EF能够正确地转换到数据库,如下所示:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        modelBuilder.Entity<MyEntity>(entity =>
        {
            entity.ToTable("MyTable");

            entity.Property(e => e.MyColumnDateTime)
                .HasDefaultValueSql("GETDATE()");
        });

        OnModelCreatingPartial(modelBuilder);
    }

DATETIME和DATETIME2都映射到System。. net中的DateTime——你不能真正地进行“转换”,因为它实际上是相同的。net类型。

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

这两个的“SqlDbType”有两个不同的值——你能在你的DataColumn定义中指定它们吗?

但是:在SQL Server上,支持的日期范围是非常不同的。

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

所以你真正需要做的是检查日期的年份-如果它是在1753年之前,你需要将它更改为1753年之后,以便SQL Server中的DATETIME列处理它。

Marc