2016-05-04 13 views
2

Wenn Expando-Objekte zum Füllen meiner Datentabelle verwendet werden, sehe ich folgende Fehlermeldung, wenn ich eine neue datarow initialisiere. Die Ausnahme ist:Ungültiger Speichertyp: DBNull

Ungültige Speichertyp: DBNull

public static DataTable ToCLDataTable<T>(List<T> items) 
{ 
    DataTable dataTable = new DataTable("CLWorkQueue"); 
    //Get all the properties 
    DataRow dr; 

    var expandoDict = items[0] as IDictionary<string, object>; 
    foreach (var key in expandoDict.Keys) 
    { 
     if ((expandoDict[key]).GetType() == typeof(DateTime)) 
     { 
      dataTable.Columns.Add(key.ToString(), typeof(DateTime)); 
     } 
     else 
     { 
      dataTable.Columns.Add(key.ToString(), expandoDict[key].GetType()); 
     } 
    } 

    for (int i = 0; i < items.Count; i++) 
    { 
     var expandoDictData = items[i] as IDictionary<string, object>; 
     //var values = new object[expandoDictData.Count]; 
     int j = 0; 
     dr = dataTable.NewRow(); /*Though the datatable has all the required columns, but whenever i try to initialize a new row an exception occurs.*/ 
     foreach (var key in expandoDictData.Keys) 
     { 
      //values[j] = expandoDictData[key].ToString(); 
      dr[key] = expandoDictData[key].ToString(); 
      j++; 
     } 
     dataTable.Rows.Add(dr); 
     //dataTable.Rows.Add(values); 
    }[enter image description here][1] 

Antwort

1

Der Wert des ersten Ergebnisses in Ihrem items[0] war DBNull.Vaue - das, was ist Ihr SQL-Client in die Struktur gefüllt. Das ist es, was der SQL-Client verwendet, um einen Nullwert anzugeben. Also, der eigentliche Typ des Objekts in der ersten Value der IDictionary<String,object> ist DBNull ... nicht der Typ wäre es gewesen, wenn es einen Wert gewesen wäre. Möglicherweise müssen Sie Ihr Wörterbuch iterieren, bis Sie einen Wert erhalten, bevor Sie diese Spalte zu dem Datarow hinzufügen können ... oder Sie erhalten eine kugelsicherere Methode, um den Typ der Spalte zuzuordnen.

+0

das funktioniert, danke @Clay –