2016-05-04 41 views
2

使用expando对象填充我的数据表时,我在初始化新的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客户端用来指示空值的原因。因此,IDictionary<String,object>的第一个Value中的对象的实际类型DBNull ...如果存在值,则不是该类型。你可能必须迭代你的字典,直到你得到一个值,然后才能将该列添加到数据目录中......或者想出一个更强大的方式来将该类型分配给列。

+0

工作,谢谢@Clay –

相关问题