【问题标题】:Having issues with DateTime (Conversion of a datetime2 datatype results in out of range)DateTime 出现问题(datetime2 数据类型的转换导致超出范围)
【发布时间】:2023-03-30 11:31:01
【问题描述】:

我收到此错误:

“将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。
语句已终止。”

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

@Html.LabelFor(model => model.BirthDate)
@Html.TextBoxFor(model => model.BirthDate, new { size = "50", @type = "date", @class = "AddMemberControls" })

用户必须输入日期的文本框显示“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,那么在调试和检查生日参数时,它会显示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; }

还有一些我忘记的其他解决方案。

【问题讨论】:

  • 01-May-18 12:00:00 AM 就是它向您显示的方式。错误消息意味着您发回的值不在有效范围内,我假设您的 DateTime birthDate01/01.0001 (以及为什么您没有绑定到您的模型)
  • 此错误消息可能是由于 BirthDate 被设置为默认日期时间值 0001-01-01。
  • 使用像 05/01/2018 这样的值,您不会收到该错误。但是,您不是绑定到您的模型,而是传递参数。也许你有错误,你没有提供设置这些参数的代码。绑定到模型将是最简单的事情。
  • 我不确定你们所说的“绑定到模型”是什么意思?我在不到 2 周前才开始使用 asp.net mvc,所以我只是初学者。
  • 您的 POST 方法应该是 public ActionResult AddMember(xxx model) 其中xxx 是您在视图中使用的模型

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


【解决方案1】:

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

这些数据类型的可接受范围不同(除其他外)。

DateTime2 的可接受范围是 0001-01-019999-12-31
(公元 9999 年 1 月 1 日至 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;

【讨论】:

  • 你也提到了 DateTime2 :-) 但是不存在这样的东西吗?我不能使用它,也找不到它的命名空间?
  • 它不是 .Net 类型,它是 SQL Server 类型。我已经编辑了我的答案以提供官方文档的链接。
  • 感谢@Zohlar Peled。我想知道。由于我使用的是 EF 代码优先方法,每次我从头开始创建数据库时都必须更改列吗?
  • @MOR_SNOW,不,您的问题不存在。 Datetime 可以正常工作,除非您需要存储早于 1753 年的日期。
猜你喜欢
  • 2011-11-15
  • 2011-04-07
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多