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()によって作成されたすべての行があります。

例:rowType〜DBNull

なぜこれが起こるのですか?

4

2 に答える 2

2

を使用しConvert.IsDBNull(reader[i])ます。

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

于 2011-11-29T14:11:54.937 に答える
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を参照してください

また、最初のループの後でnew DataRow()実行することによってその参照を放棄する場合は、最初の行に必要はないと思います。row = tbl.NewRow()

于 2011-11-29T14:30:33.013 に答える