c# - 如何从数据库中获取可为空的 DateTime

标签 c# sql-server datetime nullable sqldatareader

我的 SQL Server 数据库包含可为空的 DateTime 值。如何在我的 C# 应用程序中将它们转换为可为 null 的 DateTime 对象?

这是我认为的样子,但事实并非如此:

DateTime? dt = (DateTime?) sqldatareader[0];

最佳答案

SQL null 与 .NET null 不同;您必须与 System.DBNull.Value 进行比较:

object sqlDateTime = sqldatareader[0];
DateTime? dt = (sqlDateTime == System.DBNull.Value)
    ? (DateTime?)null
    : Convert.ToDateTime(sqlDateTime);

在回答您的评论时,DataReaderItem 属性的数据类型是基础数据库类型的数据类型。对于非空 SQL Server 数据库,它可以是 System.Data.SqlTypes.SqlDateTime,对于空列可以是 System.DBNull,或者是 System.Data。 Odbc.OdbcTypes.SmallDateTime 用于 ODBC 数据库,或者几乎任何东西。您唯一可以依赖的是它是 object 类型。

这也是我建议使用 Convert.ToDateTime() 而不是类型强制转换为 DateTime 的原因。不保证可以将 ODBC 或任何日期列强制转换为 .NET DateTime。我注意到你的评论指定了一个“sqldatareader”,一个 SQL Server System.Data.SqlTypes.SqlDateTime 确实可以被强制转换为一个 System.DateTime,但是你原来的问题没有不要告诉我们。

有关使用 DataReader 的更多信息,请参阅 MSDN .

关于c# - 如何从数据库中获取可为空的 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9503698/

相关文章:

c# - 从 XML 设计强类型对象

mysql - 仅在满足条件时运行 SQL 查询

c# - NodaTime 中时区的长格式名称

android - 在android中使用简单的日期格式将字符串值日期转换为日期

SQL Server - 根据另一个表中的类别记录唯一更新一个表

datetime - Grails解析日期

c# - 用于在列表中选择 'previous' 值的嵌套 LINQ 查询

c# - 我在哪里可以找到好的 XMPP (Jabber) 教程?

c# - 具有通用扩展方法的 AutoMapper 映射

sql - 在 SSIS 数据流任务中从源更新目标