C# C:对象不能从DbNull转换为其他类型

C# C:对象不能从DbNull转换为其他类型,c#,.net,excel,oracle,datatable,C#,.net,Excel,Oracle,Datatable,我在网上读过几篇文章,但都没有解决我的问题。 在线发布的大多数问题都指向我检查数据库中的Dbnull值,我正在代码中这样做 下面是引发异常的代码: int rowNum = Convert.ToInt32(dataTable.Rows[r][dataTable.Columns.Count - 2]); 下面是我检查dbnull值的代码: for (int r = 0; r < dataTable.Rows.Count - 1; r++) //rows { for (int c =

我在网上读过几篇文章,但都没有解决我的问题。 在线发布的大多数问题都指向我检查数据库中的Dbnull值,我正在代码中这样做

下面是引发异常的代码:

int rowNum = Convert.ToInt32(dataTable.Rows[r][dataTable.Columns.Count - 2]);
下面是我检查dbnull值的代码:

for (int r = 0; r < dataTable.Rows.Count - 1; r++) //rows
{
    for (int c = 1; c < dataTable.Columns.Count - 2; c++)
    {
        object val = dataTable.Rows[r][c];
        if (!val.Equals(DBNull.Value))
        {
            haveValues = true;
        }
    }
}
在这里,我从excel电子表格中读取值

请给我指一下正确的方向。 提前谢谢

Dimpy

在调用Convert.ToInt32之前检查DbNull:如您所见,如果值为DbNull,则会引发异常。 比如:

object x = *value from db*
int y;
if (x != DbNull.Value)
    y= Convert.ToInt32(x);
else
    //handle null somehow
对于int c=1;c 你没有检查计数2所以 dataTable.Rows[r][dataTable.Columns.Count-2]
可能是DBNull,转换失败

我倾向于使用ifvarFromSQL.ToString!=然后继续我的生意。每次都很有魅力。
然后,如果我需要System.Convert.ToSomething,我可以这样做。

您可以这样尝试:DBNull.Value.EqualsdataTable.Rows[r][c]如果您想要列的索引,可以在foreach中使用row[dataTable.Columns.IndexOfcol]

for (int r = 0; r < dataTable.Rows.Count - 1; r++) //rows
        {

            foreach (DataColumn col in dataTable.Rows[r].Table.Columns)
            {
                if (!DBNull.Value.Equals(dataTable.Rows[r][col.ColumnName]))
                {
                    haveValues = true;

                }
            }
请提供有关异常类型的更多信息,可能错误是访问无效索引=>int rowNum=Convert.ToInt32dataTable.Rows[r][dataTable.Columns.Count-2];为什么使用…Columns.Count-2?,如果列的计数等于1呢

我希望这能有所帮助

关于

您还可以检查:

dataTable.Rows[r].IsNull(c)

c可以是索引、列名或数据列

其中是属于您的异常的代码?我只看到两行互不适用的不同代码。您能否显示导致错误的线路的呼叫位置?是否尝试使用val!=DbNull.Value而不是!val.EqualsDBNull.Value?您正在检查结果集中是否至少有一个值。这是反向的-只有当值不是DBNull时,才能读取它们。因此,如果不想逐个字段进行检查,则需要反转逻辑-如果至少有一个值为DBNull.value,则无法读取数据。我最终没有找到解决问题的方法。同样的代码适用于我在同一项目上工作的同事。它必须是dll差异,可能是。我有一个更新版本的telerik和syncfusion DLL,我们目前正在使用,这可能也是一个问题。不确定,但我不想再花时间在这上面了。现在想想,他可能在他的数据之外。查找从0开始的第2行和第1行时,我使用了count-2,因为excel电子表格中有一个隐藏字段,在我的情况下,我只能在取消隐藏列时将其上载到网格。具体错误是:mscorlib.dll中发生了类型为“System.InvalidCastException”的异常,但未在用户代码中处理其他信息:无法将对象从DBNull转换为其他类型。该异常是专门针对int rowNum=Convert.ToInt32dataTable.Rows[r][dataTable.Columns.Count-2]引发的;它有12列;最后一列是隐藏列,它表示无法识别最后一列。在未隐藏时工作正常。关于处理隐藏列有什么想法吗?user3114594,我有一个应用程序使用这样的东西:if!DBNull.Value.EqualsdataTable.Rows[r][col.ColumnName]但它是一个带有sql server的web应用程序,对于excel,您可能需要检查列的数量,然后验证或询问列名是否存在=>xRow.Table.columns.Containsname\u of\u column