【问题标题】:Unable to convert DateTime from SQL Server to C# DateTime无法将 DateTime 从 SQL Server 转换为 C# DateTime
【发布时间】:2017-02-07 21:26:46
【问题描述】:

我用 C# 编写了一个使用日期的程序。它从 SQL Server 表中获取值。我使用的是 Windows 7,程序运行良好。我有这行代码:

DateTime fechaOperacion = Convert.ToDateTime(reader["FechaOperacion"]);

阅读器返回 24 小时格式的日期,我能够将其转换为 DateTime 变量。

现在我将系统升级到 Windows 10,同一行代码抛出以下错误:

字符串未被识别为有效的日期时间。从索引 20 开始有一个未知单词。

现在读者返回 a.m. / p.m.格式,并且在索引 20 处有 a.m 或 p.m.

我尝试了以下方法:

  • 将代码行改写为:

    1. Convert.ToDateTime(reader["FechaOperacion"], System.Globalization.CultureInfo.InvariantCulture)
    2. reader.GetDateTime(reader.GetOrdinal("FechaOperacion"));
  • 将区域性转换为 24 小时格式

    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(1033);
    

但似乎这些都不起作用,我不知道还能做什么。

【问题讨论】:

  • 定义“它似乎不起作用”。特别是reader.GetDateTime(reader.GetOrdinal("FechaOperacion")) 的结果是什么,这是独立于任何格式读取DATETIME 列的正确方法?
  • reader["FechaOperacion"] 返回的究竟是什么?它提到String 的事实意味着它不是“sql DateTime” - SQL datetime 值很好,不需要解析。那么:它是什么?
  • 如果 FechaOperacion 是 DATETIME 列,那么听起来像是显示问题。如果您执行var dateStr = fechaOperacion.ToString("dd/MM/yyyy HH:mm:ss"); 会发生什么? dateStr 的值是多少?
  • 您不必将 SQL datetime 转换为 C# DateTime。它们是等价的。如果您认为需要转换任何内容,那是因为您使用的是字符串而不是 datetime。而不是使用Convert,您应该能够使用直接转换,即(DateTime)。如果不能,则返回字符串
  • 从我在您的问题中读到的内容,我了解到您将日期存储在数据库中的 nvarchar/varchar 中,这不是一个好主意。如果您使用的是日期时间,则无需转换。

标签: c# sql-server datetime


【解决方案1】:

最终,这里的根本问题是将表示日期/时间的值存储为文本数据(意思是某种[n][var]char({max|n}),或在推送时:[n]text)。这有多个问题:

  • 需要更多空间
  • 无法正确/有效地排序
  • 无法正确/有效地对其进行索引
  • 无法正确/有效地过滤
  • 这会导致客户端和服务器之间的解析错误
  • 它存在各种本地化和国际化问题

你应该有一个datetime / date / time / 等列。然后将其存储为一个数字(不是字符串),它需要零解析并且可以可靠地工作而不会出现任何转换问题。


注意:它可能是您正确存储它但在查询的select 语句中对其进行格式化。在这种情况下,只需不要这样做;返回日期时间原始数据,让接收客户端担心如何显示它。

【讨论】:

    【解决方案2】:

    根据您的实际格式,您可以定义一个合适的格式列表并进行如下转换

    string[] mfs = { "MM/dd/yyyy HH:mm:ss",  "MM/dd/yyyy h:mm:ss tt"};
    
    var dat = DateTime.ParseExact("04/23/1945 8:45:22 PM", mfs, 
                    System.Globalization.CultureInfo.InvariantCulture, 
                    System.Globalization.DateTimeStyles.None);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2019-09-02
      • 2013-11-29
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多