2010-07-23 3 views
1

J'ai un DataTable selon les besoins du client, il peut contenir date invalide dire "00/00/1999", NULL, chaîne vide. (Dactylographié DATSET)DataTable EnumerableRowCollection

Quand je les collectionne comme enumerables i souhaite convertir n'importe lequel de ces formulaires invalides en chaîne vide.

(i.e.)

EnumerableRowCollection<DataRow> query = 
    from order in _table.AsEnumerable() 
    select 
    new { 
     OrderDate= 
     string.IsNullorEmpty(Convert.ToString(order.Field<DateTime>("OrderDate")) 
     || 
     (How to check Date is Invalid date) 
     ? String.Empty : order.Field<DateTime>("OrderDate") 
     } 

Comment vérifier si une date est une date valide ou non?

+0

Quel type de données est OrderDate, vous lui attribuez une chaîne vide dans un cas et un DateTime dans l'autre? – heisenberg

Répondre

2

DateTime.TryParse ... comme celui-ci étant donné votre code actuel:

DateTime date; 
EnumerableRowCollection<DataRow> query = 

    from order in _table.AsEnumerable() 
    select 
    new { 
     OrderDate= 
     string.IsNullorEmpty(Convert.ToString(order.Field<DateTime>("OrderDate")) 
     || 
     !DateTime.TryParse(Convert.ToString(order.Field<DateTime>("OrderDate")),out date) 
     ? string.Empty : date.ToShortDateString() 
     } 

(en utilisant le bloc-notes pour un IDE si des excuses s'il y a une erreur de syntaxe, mais qui devrait vous donner l'idée générale)

Je suppose que OrderDate est une chaîne puisque vous essayez de l'assigner string.Empty, si c'est un DateTime alors changez l'assignation ternaire à quelque chose comme DateTime.MinValue à la place de la chaîne vide (ou ce que vous voulez utiliser pour votre dates "invalides", puisqu'une chaîne vide n'est plus une option):

? DateTime.MinValue:date 

ou si OrderDate est un DateTime nullable puis

? null:date 
+1

Les deux valeurs de l'opérateur ternaire doivent être du même type. Vous ne pouvez pas avoir un DateTime et l'autre être une chaîne. – tvanfosson

+0

@tvanfosson Merci, remarqué qu'après avoir posté. C'était un reste de son code original, je l'ai adressé ma réponse. – heisenberg

0

Je pense que la réponse de kekekela est correcte, mais il semble inefficace en raison de la duplication inutile. Je vous suggère:

DateTime date; 
EnumerableRowCollection<DataRow> query = 

from order in _table.AsEnumerable() 
select 
    new { 
     OrderDate = 
      !DateTime.TryParse(Convert.ToString(
       order.Field<DateTime>("OrderDate")), out date) 
      ? String.Empty : date.ToShortDateString() 
     } 

La clé ici est que TryParse ne jette pas nul ou vide.

+0

Je l'essayerais aussi avec 'ToString' au lieu de' Convert.ToString' ... –

0

Voici une réponse plus concise.

var badDate = DateTime.Parse("01/01/1999"); 
var query = 
    from order in _table.AsEnumerable() 
    select new { 
     OrderDate = (order.Field<DateTime>("OrderDate").Date == badDate.Date) ? String.Empty : date.ToShortDateString() 
    }; 

REMARQUE: Il n'est pas possible de stocker "00/00/1999" comme type temporel dans une base de données relationnelle. Je pense que vous vouliez dire "01/01/1999" pour être la valeur sentinelle.