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,但在第二个循环中,我拥有了由 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 回答