2008-10-04 11 views
11

Lorsque je récupère un enregistrement à l'aide de LINQ avec un champ DateTime, seul ToString() est disponible.DateHeure, DateHeure? et LINQ

Où sont les autres méthodes DateTime?

Je dois Convert.ToDateTime le DateTime? que le champ retourne?

Quelle est la différence entre (DateTime) et (DateTime?)

Répondre

16

Si par DateTime? vous dire un Nullable<DateTime>, alors vous pouvez obtenir la valeur DateTime via la propriété DateTime?.Value.

+0

... ou en lançant la commande DateTime? dans un DateTime. Dans les deux cas, vous devriez vérifier s'il est null en premier ou vous obtiendrez une exception. – Lucas

+0

Merci! Je sais que c'était il y a presque un an, mais votre réponse m'a empêché de publier une nouvelle question. –

0

La collision d'espace de noms de côté, je sais que le datetime de SQL a une époque différente (et donc une autre plage de dates valides) que datetime C#. Essayez d'envoyer un new DateTime() à une procédure stockée et voyez ce que je veux dire.

9

En SQL, DateTimes sont autorisés à être null. En C#, DateTimes ne peut pas être nul. Vous pouvez en lire un peu plus sur le nullable value types. Puisque les variables de type valeur ne peuvent pas être nulles, une classe générique a été créée pour gérer cette situation. Il est appelé Nullable <> et il est généralement écrit avec un point d'interrogation après le type.

Afin d'utiliser ces valeurs, vous voudrez vérifier la propriété .HasValue. C'est un booléen qui sait s'il y a une valeur dans l'objet ou il est nul. Une fois que vous avez vérifié que la propriété .HasValue est true, vous pouvez utiliser la propriété .Value en toute sécurité. La propriété .Value sera de type DateTime.

+0

HasValue a été très utile pour travailler avec la vérification des valeurs d'entiers NULL possibles dans une requête LINQ comme ceci: c.Field (Of Integer?) ("SecondaryID"). HasValue – atconway

2

En SQL, le champ DateTime est défini sur Autoriser nul. Ensuite, dans LINQ, lorsque vous allez accéder au champ, .NET ne sait pas si le champ est réellement une date ou non, c'est pourquoi vous devez Convert.ToDateTime() avant que les méthodes de date ne vous soient disponibles.

Si le champ contient toujours une date, définissez la colonne de la base de données sur NOT NULL et cela devrait fonctionner.