无法将 DateTime 从 SQL Server 转换为 C# DateTime
Posted
技术标签:
【中文标题】无法将 DateTime 从 SQL Server 转换为 C# DateTime【英文标题】:Unable to convert DateTime from SQL Server to 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.
我尝试了以下方法:
将代码行改写为:
Convert.ToDateTime(reader["FechaOperacion"], System.Globalization.CultureInfo.InvariantCulture)
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 中,这不是一个好主意。如果您使用的是日期时间,则无需转换。
【参考方案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);
【讨论】:
以上是关于无法将 DateTime 从 SQL Server 转换为 C# DateTime的主要内容,如果未能解决你的问题,请参考以下文章
DateTime 列上的 Mono InvalidOperationException (SQL Server)
SQL Server 算术溢出错误 - 将 nvarchar 转换为 datetime
将 SQL Server 中 datetime 字段的默认值添加到时间戳