2009-07-07 6 views
1

Salut J'essaie de retourner une collection qui peut avoir des valeurs de date nulles. Toutefois, si elles sont null, je veux les conserver de cette façon et ne pas utiliser simplement une date arbitraire à la place.Traiter les dates nulles renvoyées par db

Si c'était une chaîne, je vérifierais pour ainsi comme nulls:

calEventDTO.occurrenceType = dr.IsDBNull(10) ? null : dr.GetString(10); 

Comment pourrais-je faire la même chose pour une date? Ce qui suit ne compile pas (Il n'y a pas de conversion implicite entre 'null' et System.DateTime ').

calEventDTO.recurrenceID = dr.IsDBNull(9) ? null : dr.GetDateTime(9); 

Mon dto est configuré pour gérer les valeurs nulles.

public DateTime? recurrenceID 
    { 
     get { return _recurrenceID; } 
     set { _recurrenceID = value; } 
    } 

Des conseils/aides/pointeurs très appréciés. grâce

Répondre

8

Essayez:

calEventDTO.recurrenceID = dr.IsDBNull(9) ? null : (DateTime?) dr.GetDateTime(9); 

Le? L'opérateur requiert que les deux opérandes (null, et dr.GetDateTime (9) dans ce cas) soient du même type.

+0

you d man! Merci! – user17510

5

L'opérateur conditionnel ne considère pas ce que vous attribuez le résultat, vous devez jeter ou l'autre des opérandes à DateTime ?:

calEventDTO.recurrenceID = dr.IsDBNull(9) ? (DateTime?)null : dr.GetDateTime(9); 
0

IsDBNull (int) est généralement beaucoup plus lent que l'utilisation des méthodes telles que GetSqlInt32 puis à comparer DBNull.Value ou utiliser son propre .IsNull comme:

public static int Int32(this SqlDataReader r, int ord) 
    { 
     var t = r.GetSqlInt32(ord); 
     return t.IsNull ? default(int) : t.Value; 
    } 

essayé quelques solutions de modèle, mais sans succès jusqu'à présent. Le problème est que tous les types Sql-types (SqlInt32 ici) sont en fait des structures et alors qu'ils ont tous la propriété .Value C# n'a pas de vrai modèle pour gérer cela. En outre, ils ont leur propre interface INullable qui a seulement .IsNull et n'est pas compatible avec Nyllable <>.

Je soupçonne que l'on aurait besoin d'un ensemble complet de types Sql en tant que modèles C# ou d'ajouter ICOnvertible à eux afin de pouvoir avoir seulement une ou deux méthodes basées sur des modèles.

Si quelqu'un a peut-être une idée avec un truc fonctionnel ou deux, parlez :-)

Questions connexes