![](/img/trans.png)
[英]Object cannot be cast from DBNull to other types for Double Data Type
[英]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.