在转换为整型之前先将空字段转换为零
本文关键字:转换 字段 整型 | 更新日期: 2023-09-27 18:05:58
在我的程序中,我循环遍历一个数据表以从每个字段获取数据。我的一行代码是这样的:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
基本上,我只是取单元格中的值并将其转换为int32。但是,当字段中的数据为空时,我遇到了一个问题。我得到一个关于无法将"DBNull"转换为另一种类型的无效强制转换错误消息。
所以,我知道我可以在尝试转换它之前检查字段的值,像这样做:
if (resultsDT.Rows[currentRow]["LYSMKWh"] == null)
{
resultsDT.Rows[currentRow]["LYSMKWh"] = 0;
}
但是,有更好的方法来做到这一点吗?是否有一些我可以做"内联",而我试图转换的值,而不必诉诸于使用if
?
编辑:我确实尝试使用这个建议的方法:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? "0");
不幸的是,我仍然收到了关于DBNull类型的Invalid Cast错误消息。有人建议我在使用??
操作符另外,由于我可以完全控制构建数据表的数据,因此我更改了它,以便不会将空值写入任何字段。在这种情况下,这基本上否定了将null转换为int32的需要。谢谢大家的建议!
你可以这样做:
var LYSMKWh =
resultsDT.Rows[currentRow]["LYSMKWh"].Equals(DBNull.Value)
? 0
: Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
使用??接线员:
resultsDT.Rows[currentRow][...] ?? "0"
(期望字段是字符串-如果不更改"0")
您可以考虑使用c#的??
操作符,该操作符检查值是否为空,如果为空,则为其分配默认值
你可以使用??接线员:
object x = null;
int i = (int)(x ?? 0)
您可以使用自定义转换方法:
public static int ConvertToInt32(object value, int defaultValue) {
if (value == null)
return defaultValue;
return Convert.ToInt32(value);
}
可能需要接受其他类型(如string)的重载。如果两侧的类型不同,则??
操作符可能会出现问题。
可以用一个三元操作符替换:
var rowData = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = rowData != null ? Convert.ToInt32(rowData) : 0;
或者,??
操作符也可以工作:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? 0);
可以使用扩展方法
int LYSMKWh = resultsDT.Rows[currentRow]["LYSMKWh"].IfNullThenZero();
创建如下类
public static class Converter
{
public static Int32 IfNullThenZero(this object value)
{
if (value == DBNull.Value)
{
return 0;
}
else
{
return Convert.ToInt32(value);
}
}
}
检查是否为DBNull.Value
而不是null
:
if (resultsDT.Rows[currentRow]["LYSMKWh"] == DBNull.Value)
{
resultsDT.Rows[currentRow]["LYSMKWh"] = 0;
}
三元表达式是这样工作的:
var LYSMKwhField = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = LYSMKwhField != DBNull.Value ? Convert.ToInt32(rowData) : 0;