2017-12-06 1 views
0

Beim Lesen von Daten aus der Datentabelle, die von einer Excel-Datei aufgefüllt wird, kann "Objekt vom Typ 'System.Double' nicht in den Typ 'System.String' umgewandelt werden." Ausnahme, wenn der Spaltentyp doppelt ist. Mein Code sieht aus wie untenLINQ-Operation zum Erstellen einer Cast-Ausnahme

var importedProducts = dtImportedData.AsEnumerable() 
         .Where(dtProduct => !string.IsNullOrWhiteSpace(dtProduct.Field<string>("product_id"))) 
         .Select(dtProduct => new 
         { 
          product_id = dtProduct.Field<string>("product_id").Trim(),        
          product_qty = Convert.ToInt32(dtProduct.Field<double>("product_qty ")) 
         }).ToList(); 

Wenn product_id Spalte Text-Datentyp hat, alles in Ordnung ist. Wenn jedoch ein doppelter Datentyp vorhanden ist, wird eine Ausnahme ausgelöst.

Ich habe Lösung bereits versucht, von here

+0

So haben Sie eine Spalte, die ihren Typ in einen anderen Typ magisch ändern? – Steve

+0

@Steve, Sie haben Recht. Benutzer ändern Excel Spalte Dateityp nach seinem Wunsch und wir können es nicht kontrollieren. – user1926138

+0

Logischerweise sollten Sie dann nicht denselben Code zum Lesen verschiedener Datentypen verwenden. – Steve

Antwort

3

Nun, wenn product_id ein Doppel- und kein String, warum Sie es string überhaupt werfen?

.Where(row => !string.IsNullOrWhiteSpace(row.Field<double>("product_id").ToString())) 
.Select(row => new 
{ 
    product_id = row.Field<double>("product_id"),        
    product_qty = (int)row.Field<double>("product_qty") 
}) 

ich mit einem Feld mag den !string.IsNullOrWhiteSpace Ansatz nicht, dass ein double oder double? enthält. Ich bin mir ziemlich sicher, dass Sie (zu prüfenden) verwenden:

.Where(row => row.Field<double?>("product_id").HasValue) 
.Select(row => new 
{ 
    product_id = row.Field<double?>("product_id").Value,        
    product_qty = (int)row.Field<double>("product_qty") 
}) 

Wenn Sie nicht wissen, den Typ eines DataColumn in einem DataTable Sie dies im Debugger ausführen kann:

dtImportedData.Columns["product_id"].DataType; 

Dies ist, was Sie in Field<T> verwenden müssen.


Wenn der Typ wirklich verändert, wie kommentiert dies die sicherste ist:

.Where(row => !string.IsNullOrWhiteSpace(row["product_id"].ToString())) 
.Select(row => new 
{ 
    product_id = row["product_id"].ToString().Trim(),        
    product_qty = int.Parse(row["product_qty"].ToString().Trim()) 
}) 
+0

Tim Schmelter, Produkt_ID-Datentyp ist Zeichenfolge. Aber ich beziehe die Variable dtImportedData aus einer Excel-Datei, und der Benutzer ändert weiterhin den Excel-Spalten-Datentyp. – user1926138

+1

@ user1926138: ich verstehe nicht, ist es Zeichenfolge oder doppelt oder ändern, was ist das? Du hast meinen Tipp am Ende der Antwort gesehen? –

+0

Es ändert sich. Der Benutzer kann jeden Datentyp in Excel-Tabelle verwenden und ich muss es in eine Zeichenfolge konvertieren. – user1926138

Verwandte Themen