2016-05-04 16 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クライアントがヌル値を示すために使用するものです。したがって、最初のValueIDictionary<String,object>のオブジェクトの実際のタイプDBNullのものではありませんでした。その列をデータローに追加する前に値を取得するまで、辞書を反復する必要があるかもしれません。または、型を列に割り当てるより弾力のある方法を思いついてください。

+0

、ありがとう@Clay –