DataRow type is DBNull

本文关键字:DBNull is type DataRow | 更新日期: 2023-09-27 18:16:10

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,但在第二个循环中,我有由NewRow()创建的DBNull类型的所有行。

。rowType ~ DBNull

为什么会这样?

DataRow type is DBNull

使用Convert.IsDBNull(reader[i])

将GetType()结果与string进行比较是非常糟糕的。

您可以使用这个来确定您正在查看的值是否为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()来放弃该引用