Comment obtenir DateTime nullable hors de la base de données
Ma base de données SQL Server contient nullable valeurs DateTime. Comment puis-je les convertir en un nullable objet DateTime dans mon application en C#?
C'est ce que je pense, il devrait ressembler, mais il n'a pas d':
DateTime? dt = (DateTime?) sqldatareader[0];
source d'informationauteur pikachu
Vous devez vous connecter pour publier un commentaire.
SQL null n'est pas le même que pour un .NET null; vous devez comparer contre le Système.DBNull.Valeur:
En réponse à votre commentaire, le type de données de la
Item
propriété d'unDataReader
est que du sous-jacent type de base de données. Il pourrait êtreSystem.Data.SqlTypes.SqlDateTime
pour un non-nulle de la base de données SQL Server, ouSystem.DBNull
pour une colonne null, ouSystem.Data.Odbc.OdbcTypes.SmallDateTime
pour une base de données ODBC, ou vraiment n'importe quoi. La seule chose que vous pouvez compter sur, c'est qu'il est de typeobject
.C'est aussi pourquoi je suggère d'utiliser
Convert.ToDateTime()
au lieu de contrainte de type àDateTime
. Il n'y a aucune garantie d'un ODBC ou quelle que soit la date de la colonne peut être contraint à un .NETDateTime
. Je note votre commentaire indique un "sqldatareader", et un Serveur SQL serverSystem.Data.SqlTypes.SqlDateTime
peut en effet être contraint à unSystem.DateTime
mais votre question de départ ne nous a pas dit que.Pour plus d'informations sur l'utilisation de
DataReader
s, consulter MSDN.J'ai récemment trouvé ce truc, c'est simple:
Vous avez besoin de vérifier si la valeur "est DBNull" plutôt que de juste valeur null. J'ai posté une petite classe d'aide sur mon blog: http://improve.dk/archive/2007/10/08/handling-dbnulls.aspx
Une fois que vous implémentez la classe, vous l'utilisez comme ceci:
Il y a un moment, j'ai écrit un tas de méthodes d'extension pour un DataRow de faire exactement ce genre de passer...parce que je déteste l'écriture répétitive radotage. L'utilisation est simple:
Voici la pièce pour les valeurs DateTime. Ajout de la mise en œuvre, pour d'autres types de données devrait être assez trivial. Ne serait pas difficile de faire le même genre de chose à un DataReader si l'on était si incliné.
J'ai essayé de venir avec des méthodes génériques, mais des limites dans la façon dont les génériques sont fait fait qu'il est difficile ou impossible à faire et à toujours obtenir le comportement que je voulais (par exemple,
null
valeurs plutôt que dedefault(T)
— obtenir les valeurs par défaut de SQL Null qui permettrait de faire la différenciation entre0
etnull
...difficile).Suffit d'utiliser:
Le rendre facile sur vous-même 🙂
comment sur la création de la méthode d'assistance
Utilisation