遇到DateTime问题(转换datetime2数据类型导致超出范围)

时间:2018-05-01 10:40:01

标签: c# asp.net-mvc entity-framework

我收到此错误:

  

"将datetime2数据类型转换为日期时间数据类型导致超出范围的值。
该语句已终止。"

与用户交互的视图具有以下相关代码:

@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; } 

例如,如果用户选择日期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; }

还有一些我忘了的解决方案。

1 个答案:

答案 0 :(得分:1)

从错误消息中可以清楚地看出,实际数据库表中的数据类型不是DateTime2而是DateTime

这些数据类型的可接受范围(以及其他内容)不同。

DateTime2的可接受范围是0001-01-019999-12-31
(公元1月1日至9月9日12月31日)
虽然DateTime的可接受范围仅为1753-01-019999-12-31 (1753年1月1日至9999年12月31日)。 (奖金阅读:Why?

有很多原因导致您停止使用DateTime并使用DateTimeDateTime2代替 - here is a good blog post about it.

因此,要解决此问题,请将数据库列的数据类型从DateTime更改为DateTime2。这可以通过简单的alter table dml语句来完成:

ALTER TABLE YourTable
    ALTER COLUMN col DateTime2;