c# SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
环境:window 10 x64vs2019.net core 3.1efcore3.1.9sqlserver 2008r2原因:将0000:01:01 00:00:00插入到datetime类型溢出了,因为datetime的范围是0001-01-01到 9999-12-31!!!一、sqlserver支持的日期时间类型(全)参照:https://docs.microsoft.com/zh-cn/
·
环境:
- window 10 x64
- vs2019
- .net core 3.1
- efcore 3.1.9
- sqlserver 2008r2
原因:
将0000:01:01 00:00:00插入到datetime类型溢出了,因为datetime的范围是0001-01-01到 9999-12-31!!!
一、sqlserver支持的日期时间类型(全)
参照:https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/date-and-time-types?view=sql-server-ver15





二、出错原因
当定义如下表时:
create table test(
id int primary key,
createdate datetime
)
如果我们执行下面语句:
insert into test(id,createdate) values(1,'0000-01-01 00:00:00');
name将会得到如下错误:
三、使用efcore快速复现
还是用上面那张表,新建.net core控制台工程TestDateTimeBug
引入包Microsoft.EntityFrameworkCore.SqlServer:
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.9" />
</ItemGroup>
配置DBContext和实体类,新建文件TestDbContext.cs,代码如下:
using Microsoft.EntityFrameworkCore;
using System;
using System.ComponentModel.DataAnnotations.Schema;
namespace TestDateTimeBug
{
public class TestDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=test;User Id=sa;Password=123456");
}
}
public DbSet<Test> Tests { set; get; }
}
[Table("test")]
public class Test
{
public int Id { get; set; }
public DateTime CreateDate { get; set; }
}
}
此时,在Program.cs中书写插入代码:
using System;
namespace TestDateTimeBug
{
class Program
{
static void Main(string[] args)
{
using (var db = new TestDbContext())
{
var test = new Test()
{
Id = 1
};
db.Tests.Add(test);
db.SaveChanges();
};
Console.WriteLine("Hello World!");
}
}
}
当运行后发现报错:
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)