c# - DateTime 出现问题(datetime2 数据类型的转换导致超出范围)
问题描述
我收到此错误:
“将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。
语句已终止。”
与用户交互的视图有如下相关代码:
@Html.LabelFor(model => model.BirthDate)
@Html.TextBoxFor(model => model.BirthDate, new { size = "50", @type = "date", @class = "AddMemberControls" })
用户必须输入日期的 texbox 显示“mm/dd/yyyy”(它显示了一个日历,用户可以在其中选择日期)
控制器方法如下所示:
public ActionResult AddMember(string firstName, string lastName, DateTime birthDate, int age, string sportType)
{
var member = new Member() { FirstName = firstName, LastName = lastName, Age = age, SportType = sportType, BirthDate = birthDate };
coloContext.Members.Add(member);
coloContext.SaveChanges();
return View();
}
和型号:
[Column(TypeName = "datetime2")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime BirthDate { get; set; }
例如,如果用户选择 date 05/01/18
,那么在调试和检查birthdate 参数时,它会说01-May-18 12:00:00 AM
我想问题是它写了“May”,而数据库不知道如何保存它?
我看到互联网上有很多关于这个问题的信息,并且尝试了几次解决方案,但不幸的是,都没有对我有用。
我努力了:
添加带有列类型名称的注释
[Column(TypeName = "datetime2")]
在我的模型中制作 Datime nullabe(建议了几种解决方案)。但是这个解决方案对我来说没有多大意义。特别是当我知道这个参数不能为空时
public DateTime? BirthDate { get; set; }
试图解析DateTime,希望它能摆脱“May”。如果可能的话,我希望以这种格式保存日期。
DateTime test = DateTime.parse(birthDate.ToString())
有人建议更改为 DateTime2,但没有对象称为 DateTime2?无论如何我都试过了,但在这个问题上出错了
public DateTime2 BirthDate { get; set; }
还有一些我忘记的其他解决方案。
解决方案
从错误消息中可以清楚地看出,实际数据库表中的数据类型不是DateTime2
but DateTime
。
这些数据类型的可接受范围不同(除其他外)。
可接受的范围DateTime2
是0001-01-01
到9999-12-31
(公元 1 月 1,1 日到 9999 年 12 月 31 日)
,而可接受的范围DateTime
是只1753-01-01
到9999-12-31
(1753 年 1 月 1 日到 9999 年 12 月 31 日)。(额外阅读:为什么?)
DateTime
您应该停止使用和使用Date
,Time
或DateTime2
取而代之的原因有很多-这是一篇很好的博客文章。
因此,要解决此问题,请将数据库列的数据类型从DateTime
更改为DateTime2
。这可以通过一个简单的alter table
dml 语句来完成:
ALTER TABLE YourTable
ALTER COLUMN col DateTime2;
推荐阅读
- javascript - 在 v-for 循环中记住上传时的图像位置
- ssh - sudo over ssh - 不接受密码时卡住
- vue.js - 如何在 VueJS 中使用 ThreeJS
- c# - 从 C# MVC 实体框架中的数据库 onclick 中删除条目
- java - android.view.InflateException: Binary XML file line #99: Binary XML file line #99: Error inflating class android.widget.ProgressBar
- xamarin - 如何制作带有文本中心的圆形进度条
- azure - 一次调用检索存储库列表及其标签版本
- nginx - docker push 到 Kubernetes 集群内的私有 Docker 注册表失败,并显示:413 Request Entity Too Large
- c# - 如何在不复制/粘贴代码块的情况下重用逻辑 - C#
- matplotlib - 使箱线图中的平均点更大并将它们相互连接