C#:Object无法从DbNull转换为其他类型

时间:2015-11-16 16:44:05

标签: c# .net excel oracle datatable

我在网上看过几篇帖子,但没有一篇能解决我的问题。 在线发布的大多数问题都指向我从数据库中检查Dbnull值,我在代码中这样做。

这里是引发异常的代码:

<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipeRefreshLayout_pitchList"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView_pitchList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:scrollbars="vertical">
</android.support.v7.widget.RecyclerView>

这是我检查dbnull值的代码:

int rowNum = Convert.ToInt32(dataTable.Rows[r][dataTable.Columns.Count - 2]);

这里我正在阅读excel电子表格中的值。

请指出正确的方向。 提前谢谢。

Dimpy

6 个答案:

答案 0 :(得分:2)

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

object x = *value from db*
int y;
if (x != DbNull.Value)
    y= Convert.ToInt32(x);
else
    //handle null somehow

答案 1 :(得分:1)

您还可以查看:

dataTable.Rows[r].IsNull(c)

c可以是索引,列名称或DataColumn

答案 2 :(得分:0)

for(int c = 1; c&lt; dataTable.Columns.Count - 2 ; c ++)

你不会检查第二个计数器 dataTable.Rows [r] [ dataTable.Columns.Count - 2 ] 可能是DBNull,你的转换失败

答案 3 :(得分:0)

我倾向于if(varFromSQL.ToString()!=&#34;&#34;)然后继续我的业务。每次都像魅力一样。 然后,如果我需要System.Convert.ToSomething(),我可以这样做。

答案 4 :(得分:0)

你可以尝试这样:DBNull.Value.Equals(dataTable.Rows [r] [c])如果你想要列的索引你可以在foreach中使用row [dataTable.Columns.IndexOf(col)]

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;

                }
            }

并且请提供有关异常类型的更多信息,可能错误是访问无效索引=&gt; int rowNum = Convert.ToInt32(dataTable.Rows [r] [dataTable.Columns.Count - 2]);为什么你使用... Columns.Count - 2 ?,如果列数等于1怎么办?

我希望这会有所帮助。

此致

答案 5 :(得分:0)

我终于没有找到问题的解决方案。相同的代码适用于在同一项目上工作的同事。它必须是dd差异,可能是。我有一个较新版本的telerik和syncfusion dll,我们目前正在使用它,这可能也是一个问题。不确定,但我不想再花那么多时间了。