Wartość null SQL nie jest taka sama jak wartość null platformy .NET; musisz porównać z System.DBNull.Value:
object sqlDateTime = sqldatareader[0];
DateTime? dt = (sqlDateTime == System.DBNull.Value)
? (DateTime?)null
: Convert.ToDateTime(sqlDateTime);
W odpowiedzi na Twój komentarz, typ danych Item właściwość DataReader jest typem bazowej bazy danych. Może to być System.Data.SqlTypes.SqlDateTime dla bazy danych SQL Server innej niż null lub System.DBNull dla kolumny o wartości null lub System.Data.Odbc.OdbcTypes.SmallDateTime dla bazy danych ODBC, a właściwie czegokolwiek. Jedyną rzeczą, na której możesz polegać, jest to, że jest typu object .
Dlatego też sugeruję użycie Convert.ToDateTime() zamiast wpisywać przymus na DateTime . Nie ma gwarancji, że ODBC lub jakakolwiek kolumna daty może zostać przekonwertowana na DateTime platformy .NET . Zauważyłem, że twój komentarz określa "sqldatareader" i SQL Server System.Data.SqlTypes.SqlDateTime rzeczywiście może być zmuszona do System.DateTime , ale Twoje pierwotne pytanie nam tego nie mówiło.
Aby uzyskać więcej informacji na temat korzystania z DataReader s, skonsultuj się z MSDN.