我发现几乎与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) { }
}
答案 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块。