sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo obtener DateTime anulable fuera de la base de datos

Un valor nulo de SQL no es lo mismo que un valor nulo de .NET; tienes que comparar con System.DBNull.Value:

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

En respuesta a su comentario, el tipo de datos del Item propiedad de un DataReader es el del tipo de base de datos subyacente. Podría ser System.Data.SqlTypes.SqlDateTime para una base de datos de SQL Server no nula, o System.DBNull para una columna nula, o System.Data.Odbc.OdbcTypes.SmallDateTime para una base de datos ODBC, o realmente casi cualquier cosa. Lo único en lo que puede confiar es que es de tipo object .

Esta es también la razón por la que sugiero usar Convert.ToDateTime() en lugar de escribir coacción a DateTime . No hay garantía de que un ODBC o cualquier columna de fecha pueda ser forzado a un .NET DateTime . Observo que su comentario especifica un "sqldatareader" y un SQL Server System.Data.SqlTypes.SqlDateTime de hecho puede ser forzado a un System.DateTime , pero su pregunta original no nos dijo eso.

Para obtener más información sobre el uso de DataReader s, consulte MSDN.