【问题标题】:ASP.NET MVC 5 'DateTime' cannot be saved on sql server 'datetime' format on Release (published) mode but works on Debug modeASP.NET MVC 5 'DateTime' 无法在发布(已发布)模式下以 sql server 'datetime' 格式保存,但适用于调试模式
【发布时间】:2022-01-29 17:09:41
【问题描述】:

所以我有一个 ASP.NET MV5 应用程序,我正在使用 Entity Framework 6 和一个 SQL Server 数据库。我也用这个:datepicker

我有这种格式的 bootstrap-datepicker 输入:'dd.mm.yyyy'。使用 jQuery,我得到了这个字段的值,它与 "29.01.2022" 完全相同,然后我将它发送到一个 ASP.NET MVC 操作方法,该方法需要一个 DateTime 参数。

在我的操作中,该参数自动转换为DateTime 格式,但保留正确的日期。

日期选择器配置:

$(".input-daterange") {
   language: 'ro',
   format: 'dd.mm.yyyy',// this gives 29.01.2022
   //format: 'dd.MM.yyyy',// this gives 29.Jan.2022
   autoclose: true,
   calendarWeeks: true,
   clearbtn: true,
   disableTouchKeyboard: true
}

我使用 Entity Framework 6 进行数据库访问,所以我的代码如下所示:

public Action SaveField(int rowId, DateTime fieldDateValue)
{
    var itemToUpdate = _context.TableName.Single(i => i.id = rowId);    // this is not null
    itemToUpdate.StartDate = fieldDateValue;

    try
    {
        _context.SaveChanges()
    }
    catch
    { ... }
}

这段代码在调试模式下运行良好,但是当我发布应用程序时一切都变得疯狂,我得到一个错误

字符串未被识别为有效的日期时间

到目前为止我尝试过的(因为 datepicker 格式:dd.mm.yyyy):

  1. itemToUpdate.StartDate = fieldDateValue
  2. itemToUpdate.StartDate = Convert.ToDateTime(fieldDateValue.ToString("yyyy-MM-dd HH:mm:ss")) --> 这工作了几次,但数据库中保存的日期是从 29.01.20222022-29-01 所以类似于 yyyy-MM-dd,但也会出错
  3. itemToUpdate.StartDate = DateTime.ParseExact(fieldDateValue.ToString(), "dd.mm.yyyy", CultureInfo.InvariantCulture);
  4. itemToUpdate.StartDate = DateTime.ParseExact(fieldDateValue.ToShortDateString(), "dd.mm.yyyy", CultureInfo.InvariantCulture);

考虑到我在远程服务器上运行的应用程序的已发布版本(这可能会解释问题)但也在同一台机器上(IIS wwroot),我根本无法理解我做错了什么。

有人能告诉我如何正确管理日期格式,这样调试和发布版本之间就不会再出现问题和差异了吗?

【问题讨论】:

  • "var itemToUpdate = _context.TableName.Single(i => i.id = rowId);/// this is not null" 你确定这是真的吗?使用 SingleOrDefault 似乎很容易,并且在进行值重新分配和保存更改之前检查 itemToUpdate 是否为空。
  • @AndyStagg 是的,我确定,我不想写太多,但我很肯定它不为空
  • 表中的列是datetime 列,因此不会以29.01.2022 之类的格式存储。我强烈建议你教你的 jQuery 日期选择器不要愚蠢,并将像 yyyyMMdd 这样的明确格式传递给数据库。其他任何东西都是不安全的。
  • 自己解析日期时,需要 MM(大写)表示月份。小写毫米是分钟
  • @HansKesting 是的,我想我现在明白了,我正在测试一些东西 - 我在其他页面上使用了“dd.mm.yyyy”,它在那里工作,但现在我已经意识到我从选择器中选择的月份变成了 01(Jan)

标签: sql-server asp.net-mvc datetime entity-framework-6 release


【解决方案1】:

所以,最后,对我的应用程序的已发布版本真正起作用的是:

  1. SQL Server 数据库中的date 格式(datetime 不起作用)
  2. 将我在ViewModel 中的归档设置为“字符串”而不是DateTime
  3. DateTime.ParseExact(fieldDateValue, "dd.MM.yyyy", CultureInfo.InvariantCulture)
  4. 构建 -> 清理项目然后发布它(只是为了安全,当您进行大量发布时)-> 这也解决了 Visual Studio 2015 的发布失败(第一次失败比第二次发布)
  5. 同样对于发布失败,最后的解决方案是从项目中删除 obj 文件夹

由于某种原因,DateTime.ParseExact(fieldDateValue.ToShortDateString(), "dd.MM.yyyy", CultureInfo.InvariantCulture) 在发布模式下无法工作

【讨论】:

  • 你为什么坚持使用无效和模棱两可的格式?恕我直言,这不是一个好的解决方案,它更像是there I fixed it 上的那些胶带作业之一。
  • @AaronBertrand 因为时间不在我身边,我不知道还能尝试什么,发布后它根本不适用于 DateTime 预期的 viewModel。
  • 啊,您发现了技术债务的完美配方。 ¯\_(ツ)_/¯
猜你喜欢
  • 1970-01-01
  • 2012-05-19
  • 2014-02-18
  • 2014-10-12
  • 1970-01-01
  • 2016-03-19
  • 2017-03-27
  • 2017-12-18
  • 1970-01-01
相关资源
最近更新 更多