C# 转换DataTable中项的数据类型时如何传递DBNull:Object can';t从DBNull强制转换为其他类型

C# 转换DataTable中项的数据类型时如何传递DBNull:Object can';t从DBNull强制转换为其他类型,c#,C#,我发现几乎所有的案例都与SQL连接和SQLReader有关 问题是:当循环到DataTable中的所有项时 我必须将行r[“Age”]和r[“Numphone”]转换为双重类型 似乎有任何项null 我尝试将所有行循环设置为field1=“” 但是我的代码不起作用 foreach (DataRow r in dt.Rows) { try { foreach (DataColumn dc in dt.Columns) { va

我发现几乎所有的案例都与SQL连接和SQLReader有关

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

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

似乎有任何项
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 };
    }
}
foreach(数据行中的数据行)
{
双倍?年龄=行字段(“年龄”);
double?numphone=行字段(“numphone”);
if(age.HasValue&&numphone.HasValue)
{
double[]inforNum={age.Value,numphone.Value};
}
}
您不应先使用
ToString
将双精度转换为字符串,然后再使用
convert.ToDouble
将其转换回双精度。这样做效率不高,可能会导致转换问题。相反,只需将其转换为正确的类型,该类型似乎是一个
double


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

我喜欢你的解决方案,它更好更干净(y),但如果其中一个为空,它将不会创建数组。我认为DataColumn
dc
包括
r[“Age”]
r[“Numphone”]。因为我循环了DataTable中的所有数据列
dt`。但问题是:其他列不需要转换为双精度类型。我有
r[“A0_2”]
有值
,但它检测到is有值,我无法
转换。对它的行进行双精度转换。您可以查看图像了解更多信息:itI中没有值更改为:
var age=r[“age”]。ToString()!="" ? Convert.ToDouble(r[“Age”]):0和它的工作。@VănLộc最好使用
string.IsNullOrEmpty(r[“Age”])
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 };
    }
}