如何在DataTable中转换项目的数据类型时传递DBNull:对象无法从DBNull转换为其他类型

时间:2016-07-14 15:03:06

标签: c#

我发现几乎与SQL连接和SQLReader有关。

问题是:循环到DataTable中的所有项目时。

我必须将行r["Age"]r["Numphone"]转换为双重类型。

似乎有任何项目null

我尝试循环所有行来设置field1 = ""

    foreach (DataColumn dc in dt.Columns)
    {
        var field1 = r[dc].ToString();
        if (field1 == null)
            field1 = "";
    }

但是我的代码没有用。

foreach (DataRow r in dt.Rows)
{
    try
    {
        foreach (DataColumn dc in dt.Columns)
        {
            var field1 = r[dc].ToString();
            if (field1 == null)
                field1 = "";
        }

        double[] inforNum = { Convert.ToDouble(r["Age"]), Convert.ToDouble(r["Numphone"]) };
    }
    catch (Exception ex) { }
}

2 个答案:

答案 0 :(得分:3)

您正在调用ToString()而未检查null因此它将失败,您应先检查null然后再致电ToString()

foreach (DataColumn dc in dt.Columns)
{
    var field1 = r[dc]!=null ? r[dc].ToString() : "";
}

你需要为另一行代码做同样的事情:

var age = r["Age"] !=null ? Convert.ToDouble(r["Age"]) : 0;
var numPhone = r["Numphone"] !=null ? Convert.ToDouble(r["Numphone"]) : 0;

double[] inforNum = new[]{ age , numPhone };

答案 1 :(得分:2)

您可以使用支持可空类型的DataRow.IsNull甚至更好DataRow.Field

foreach (DataRow row in dt.Rows)
{
    double? age = row.Field<double?>("Age");
    double? numphone = row.Field<double?>("Numphone");
    if(age.HasValue && numphone.HasValue)
    {
         double[] inforNum = { age.Value, numphone.Value };
    }
}

您不应该先使用ToString将double转换为字符串,然后使用Convert.ToDouble将其转换回double。这样做效率不高,可能导致转换问题。相反,只需将其转换为正确的类型,似乎是double

另外,不要使用例外来控制程序流程,也不要使用空的cacth块。