在转换为int之前将null字段转换为零?

时间:2011-08-17 16:31:45

标签: c# ado.net

在我的程序中,我循环遍历数据表以从每个字段获取数据。我的代码的一行看起来像这样:

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。感谢大家的所有建议!

8 个答案:

答案 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);
        }
    }
}