2011-11-29 12 views
0
private DataRow getDataRowFromReader(IDataReader reader) 
{ 
    DataRow row = new DataRow(); 
    DataTable tbl = new DataTable(); 
    for (int i = 0; i < reader.FieldCount; i++) 
    { 
     Type type = reader[i].GetType(); 
     if(type.Equals(Type.GetType("DBNull")) || type.Equals(Type.GetType("System.DBNull"))) 
      type = typeof(string); 
     DataColumn col = new DataColumn(reader.GetName(i), type); 
     tbl.Columns.Add(col); 
    } 
    row = tbl.NewRow(); 
    for (int i = 0; i < reader.FieldCount; i++) 
    { 
     Type readerType = reader[i].GetType(); 
     Type rowType = row[i].GetType(); 
     if (readerType.Equals(rowType)) 
      row[i] = reader.GetValue(i); 
     else 
      row[i] = reader.GetString(i); 
    } 
    return row; 
} 

私はDBNullを最初のループで処理しようとしていますが、2番目にはDBNull型のNewRow()で作成されたすべての行があります。DataRow型はDBNullです

rowType〜DBNull

これはどうしてですか?

+0

達成しようとしていることは何ですか? – abatishchev

+3

DataReaderを使用する[DataTableのLoadメソッド](http://msdn.microsoft.com/en-us/library/7x8ccbsb.aspx)を引数として使用しないのはなぜですか? 'DataTable dt =新しいDataTable(); dt.Load(reader); ' –

答えて

1
あなたが見ている値ががDBNullであるかどうかを調べるためにこれを使用することができます

reader.IsDBNull(i) 

あなたは、これを試すにしている列の種類を確認するには

http://msdn.microsoft.com/en-us/library/system.data.idatarecord.isdbnull.aspxを参照してください。

reader.GetFieldType(i) 

また、私はそこだと思うhttp://msdn.microsoft.com/en-us/library/system.data.idatarecord.getfieldtype.aspx

を見ます最初のループの後にrow = tbl.NewRow()を実行してその参照を放棄している場合は、最初の行にnew DataRow()の必要はありません。

2

Convert.IsDBNull(reader[i])を使用してください。

GetType()の結果をstringと比較するのはひどいです。

+3

または単に' reader.IsDBNull(i) ' –

関連する問題