2016-05-04 98 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 –

相關問題