2016-05-04 30 views
2

При использовании объектов expando для заполнения моего datatable я сталкиваюсь с следующим сообщением об ошибке при инициализации нового datarow. Исключение составляет:Недопустимый тип хранилища: DBNull

Недопустимого типа хранения: 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] 

ответ

1

значения первого результата в вашем items[0] был DBNull.Vaue - который является то, что ваш SQL клиент заселена в структуру. Это то, что клиент SQL использует для указания нулевого значения. Итак, фактический тип объекта в первом ValueIDictionary<String,object> - DBNull ... не тот тип, который был бы, если бы имелось значение. Возможно, вам придется перебирать словарь, пока не получите значение, прежде чем вы сможете добавить этот столбец в datarow ... или придумать более пуленепробиваемый способ присвоения типа столбцу.

+0

, который сработал, спасибо @ Clay –