在我的程序中,我循环遍历数据表以从每个字段获取数据。我的代码的一行看起来像这样:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
基本上,我只是获取单元格中的值并将其转换为int32。但是,当字段中的数据为空时,我遇到了一个问题。我收到一条Invalid Cast错误消息,指出无法将“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。感谢大家的所有建议!
答案 0 :(得分:9)
你可以这样做:
var LYSMKWh =
resultsDT.Rows[currentRow]["LYSMKWh"].Equals(DBNull.Value)
? 0
: Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
答案 1 :(得分:5)
使用??操作者:
resultsDT.Rows[currentRow][...] ?? "0"
(期望该字段为字符串 - 如果不更改“0”)
答案 2 :(得分:3)
您可以考虑使用C#的??
运算符,该运算符检查null的值,如果为null,则为其分配默认值。
答案 3 :(得分:2)
您可以使用自定义转换方法:
public static int ConvertToInt32(object value, int defaultValue) {
if (value == null)
return defaultValue;
return Convert.ToInt32(value);
}
您可能需要使用其他类型的重载,例如字符串。如果任何一方的类型不同,则??
运算符可能会出现问题。
答案 4 :(得分:1)
检查它是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;
答案 5 :(得分:1)
你可以用??操作者:
object x = null;
int i = (int)(x ?? 0)
答案 6 :(得分:1)
您可以使用三元运算符替换它:
var rowData = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = rowData != null ? Convert.ToInt32(rowData) : 0;
或者,??
运算符可以工作:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? 0);
但我认为这不太可读。
答案 7 :(得分:1)
您可以使用扩展方法。
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);
}
}
}