C# 转换DataTable中项的数据类型时如何传递DBNull:Object can';t从DBNull强制转换为其他类型
我发现几乎所有的案例都与SQL连接和SQLReader有关 问题是:当循环到DataTable中的所有项时 我必须将行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
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 };
}
}