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

pik*_*chu 17 c# sql-server datetime nullable sqldatareader

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

这是我认为它会是什么样子,但它没有:

DateTime? dt = (DateTime?) sqldatareader[0];
Run Code Online (Sandbox Code Playgroud)

pik*_*chu 29

我最近发现了这个技巧,很简单:

DateTime? dt = sqldatareader[0] as DateTime?;
Run Code Online (Sandbox Code Playgroud)

  • 回答你自己的问题并不愚蠢. (4认同)

Dou*_*rch 28

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

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

在回答您的注释时,Itema 的属性的数据类型DataReader是底层数据库类型的数据类型.它可能System.Data.SqlTypes.SqlDateTime是非空的SQL Server数据库,System.DBNull空列,System.Data.Odbc.OdbcTypes.SmallDateTimeODBC数据库,或者几乎任何东西.你唯一可以依赖的是它的类型object.

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

有关使用DataReaders的更多信息,请咨询MSDN.