首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataRow类型为DBNull

DataRow类型为DBNull
EN

Stack Overflow用户
提问于 2011-11-29 22:10:01
回答 2查看 5K关注 0票数 0
代码语言:javascript
复制
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

为什么会发生这种情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-29 22:30:33

您可以使用此命令来确定您正在查看的值是否为DBNull:

代码语言:javascript
复制
reader.IsDBNull(i)

请参阅http://msdn.microsoft.com/en-us/library/system.data.idatarecord.isdbnull.aspx

要查找您所在列的类型,请尝试执行以下操作:

代码语言:javascript
复制
reader.GetFieldType(i)

请参阅http://msdn.microsoft.com/en-us/library/system.data.idatarecord.getfieldtype.aspx

此外,我认为如果您在第一次循环之后通过执行row = tbl.NewRow()来放弃引用,那么在第一行就没有必要使用new DataRow()

票数 1
EN

Stack Overflow用户

发布于 2011-11-29 22:11:55

使用Convert.IsDBNull(reader[i])

将GetType()结果与字符串进行比较是很糟糕的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8312129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档