0

我从数据列返回一个整数列表。这个特定的列是 (int,null)。但我有一个例外。

Specified cast is not valid.

代码:

public List <int> GetSortOrder(DataTable dt,string columnName)
{
    List<int> Orders = new List<int>();
    foreach (DataRow row in dt.Rows)
    {
        Orders.Add((int)row[columnName]);
    }
    return Orders;
}

我想要的是如果它为空,然后将其强制为 0。我应该使用可为空的 int 类型吗?或者只是简单地使用 if ... else ...?

4

5 回答 5

6
        Orders.Add((int)(row[columnName] ?? 0));
于 2012-08-02T13:56:04.960 回答
3

该列实际上存储 DBNull.Value 而不是通常的 C# null。这就是为什么运营商??不管用。要检查列是否为空,请使用 row.IsNull 方法:

Orders.Add(row.IsNull(columnName) ? 0 : (int)row[columnName]);

操作员 ??不适用于 DBNulls。

您可能还想查看此链接:Handle DBNull in C#以获得一些将 DBNull-able int 转换为 int 的有效示例?

于 2012-08-02T14:17:07.667 回答
1

我也会使用int?我喜欢 Field 方法:

int? myInt = row.Field<int?>(columnName);
于 2012-08-02T15:31:23.317 回答
0

那应该工作:

public List <int> GetSortOrder(DataTable dt,string columnName)
{
    List<int> Orders = new List<int>();
    int? nullableInt;
    foreach (DataRow row in dt.Rows)
    {
        nullableInt = (int)row[columnName];
        Orders.Add(nullableInt??0);
    }
    return Orders;
}
于 2012-08-02T13:59:17.487 回答
0

我建议int?

Orders.Add(((int?)row[columnName]).GetValueOrDefault());

在我看来,它使意图和代码保持清晰和简洁,而if/else并没有那么好。正如其他答案所建议的那样使用?? 0也很好。

于 2012-08-02T13:56:29.267 回答