繁体   English   中英

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

[英]How to pass DBNull when convert data type of item in DataTable: Object can't cast from DBNull to other types

我发现几乎所有情况都与SQL连接和SQLReader有关。

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

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

似乎有任何项目为null

我尝试for循环所有行以设置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) { }
}

您正在调用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 };

您可以使用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将双ToString转换为字符串,然后再使用Convert.ToDouble将其转换回双Convert.ToDouble 这样效率不高,可能会导致转换问题。 取而代之的是将其强制转换为似乎是double的正确类型。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM