Um nulo SQL não é o mesmo que um nulo .NET; você tem que comparar com System.DBNull.Value:
object sqlDateTime = sqldatareader[0];
DateTime? dt = (sqlDateTime == System.DBNull.Value)
? (DateTime?)null
: Convert.ToDateTime(sqlDateTime);
Em resposta ao seu comentário, o tipo de dados do
Item
propriedade de um DataReader
é a do tipo de banco de dados subjacente. Pode ser System.Data.SqlTypes.SqlDateTime
para um banco de dados SQL Server não nulo ou System.DBNull
para uma coluna nula ou System.Data.Odbc.OdbcTypes.SmallDateTime
para um banco de dados ODBC, ou praticamente qualquer coisa. A única coisa que você pode confiar é que é do tipo object
. É também por isso que sugiro usar
Convert.ToDateTime()
em vez de digitar coerção para DateTime
. Não há garantia de que um ODBC ou qualquer coluna de data possa ser forçada a um .NET DateTime
. Observo que seu comentário especifica um "sqldatareader" e um SQL Server System.Data.SqlTypes.SqlDateTime
pode realmente ser forçado a um System.DateTime
, mas sua pergunta original não nos dizia isso. Para obter mais informações sobre como usar o
DataReader
s, consulte o MSDN.