2010-04-30 8 views
1

Je rencontre des problèmes lors de l'utilisation de linq sur un datatable.asenumerable().
Ceci lève InvalidCastException.champ <t> cast invalide

DateTime date=r.Field<DateTime>("date"); 

Cela fonctionne très bien.

DateTime date = DateTime.Parse(r.Field<string>("date")); 

Que manque-t-il?

Cordialement Sven

Répondre

1

Pourquoi vous attendez-vous à travailler? Le code suivant ne compile pas:

DateTime dt1 = (DateTime)"2004-01-01"; 

considérant que cela ne:

DateTime dt1 = DateTime.Parse("2004-01-01"); 

Comme, vous ne pouvez pas convertir une chaîne à un DateTime, donc si votre valeur est une chaîne, vous besoin de le convertir explicitement.

+0

Quand vous le dites comme ça, c'est assez évident. Manque d'expérience et de travail cérébral je suppose. Merci beaucoup! – Zwempha

0

Etes-vous sûr que votre colonne "date" est de type DateTime?

Ce code de test fonctionne comme prévu:

 DataTable dt = new DataTable(); 

     dt.Columns.Add(new DataColumn("date", typeof(DateTime))); 

     for (int i = 0; i < 10; i++) 
     { 
      DataRow row = dt.NewRow(); 
      row["date"] = DateTime.Now.AddDays(i); 
      dt.Rows.Add(row); 
     } 

     foreach (var r in dt.AsEnumerable()) 
     { 
      DateTime d = r.Field<DateTime>("date"); // no problems here! 

      Console.Write(d.ToLongDateString()); 
     } 
+0

Non, la colonne est une chaîne, mon erreur. – Zwempha

0

Cast fonctionne entre les types connexes. string et date n'appartiennent pas à la même hiérarchie & donc aucune traduction directe n'est possible.

Vous pouvez utiliser le cast, lorsque vous êtes sûr que les types sont liés et que la conversion est possible.

Parse est différent de la distribution.
Par exemple, vous indiquez à l'exécution si elle peut être analysée pour en extraire une date (selon votre exemple).