检查十进制数是否为空

32

我想检查一个十进制数是否为空或具有某个值,因为这个值是从类对象中的数据库分配的:

public decimal myDecimal{ get; set; }

然后我有

myDecimal = Convert.ToDecimal(rdrSelect[23].ToString());

我正在尝试:

if (rdrSelect[23] != DBNull.Value)
                    {
                        myDecimal = Convert.ToDecimal(rdrSelect[23].ToString());
                    }

但我得到的是:

表达式的结果始终为“true”,因为类型为“decimal”的值永远不等于null

我该如何检查该十进制数是否有一些值?


9
Decimal是一个值类型,永远不可能为空。如果您的数据库列可空,那么它应该由Decimal?表示(这是System.Nullable<Decimal>的简写)。 - Federico Berasategui
1
如果数据库中的rdrSelect[23]为空,Convert.ToDecimal将会失败。 - Andy Refuerzo
你看到错误信息了吗?它似乎很清楚。decimal 永远不可能为空,它总是有一个值。 - Servy
8个回答

61

十进制数始终具有某些默认值。如果您需要使用可空类型十进制数,可以使用decimal?。然后您可以执行myDecimal.HasValue


15

你可以使用这段代码

if (DecimalVariable.Equals(null))  
{
   //something statements
}

1
非空类型 decimal 的完美解决方案。 - Daniel ZA
1
@DanielZA 谢谢你,亲爱的朋友。 - R.Akhlaghi

6

decimal是.NET中的值类型。值类型不能为null。但是如果你对decimal使用可空类型, 那么你可以检查decimal是否为null。例如:myDecimal?

可空类型是System.Nullable结构的实例。可空类型可以表示其基础值类型的正常范围,以及额外的null值。

if (myDecimal.HasValue)

但是我认为在您的数据库中,如果该列包含可为空的值,则其类型不应该decimal

2

最近我遇到了一个问题,尝试从数据库中的DataTable对象检索空十进制数,但我在这里没有看到这个答案。我认为以下方法更简单、更短:

var value = rdrSelect.Field<decimal?>("ColumnName") ?? 0;

这在我的情况下非常有用,因为我在模型中没有可空的十进制数,但需要快速检查一个。如果数据库的值为空,它只会分配默认值。"最初的回答"

1
假设你正在从数据行中读取,你需要的是:
if ( !rdrSelect.IsNull(23) ) 
{ 
   //handle parsing
}

1

Decimal是一种值类型,因此如果您希望检查它是否具有与其初始化值(零)不同的值,则可以使用条件myDecimal != default(decimal)。

否则,您可能应该考虑使用可空(decimal?)类型,并使用诸如myNullableDecimal.HasValue的条件。


0
您还可以创建一个方便的实用程序函数来处理类似这样的情况下从数据库中获取的值。 例如,以下是一个函数,它可以从对象类型中提供可空的十进制数。
    public static decimal? ToNullableDecimal(object val)
    {
        if (val is DBNull ||
            val == null)
        {
            return null;
        }
        if (val is string &&
            ((string)val).Length == 0)
        {
            return null;
        }
        return Convert.ToDecimal(val);
    } 

0
如果您直接从SQL数据库中获取此值,且在其中的值为null,则实际上将是DBNull对象而不是null。要么在转换之前放置一个检查,并在发生DBNull时使用默认值,要么在随后替换您的null检查为对rdrSelect [23]的DBNull检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接