如何将 collasce null 运算符与 DbNull.Value 一起使用?

Posted

技术标签:

【中文标题】如何将 collasce null 运算符与 DbNull.Value 一起使用?【英文标题】:How to use collasce null operator with DbNull.Value? 【发布时间】:2014-02-16 08:22:02 【问题描述】:

这是处理DBNull.value的方法之一, 但我想要一个使用空合并运算符的语法来处理DBNull.value

这会起作用

decimal UnitPrice = row["UnitPrice"] == DBNull.Value ? 0.00m : (decimal)row["UnitPrice"];

这些我都试过了,都不行,

decimal UnitPrice = (decimal)row["UnitPrice"] ?? 0.00m
UnitPrice = Convert.ToDecimal(row["UnitPrice"]) ?? 0.00m
UnitPrice = Decimal.Parse(row["UnitPrice"].ToString()) ?? 0.00m

我收到了

Operator '??' cannot be applied to operands of type 'decimal' and 'decimal'

我可能会问错问题,或者问题可能是无效的

【问题讨论】:

如果这个答案是您问题的最佳解决方案,您可以接受其中一个答案。 【参考方案1】:

问题是 DBNull.Value 不为空。您似乎想用 0.0m 替换 DBNull.Value,但更好的解决方案是使用可为空的类型。也就是说,使用decimal? 而不是decimal。然后可以使用as 运算符:

decimal? unitPrice = row["UnitPrice"] as decimal?;

如果你不能这样做,你可以这样做:

decimal unitPrice = (row["UnitPrice"] as decimal?) ?? 0.0m

decimal unitPrice = (row["UnitPrice"] as decimal?).GetValueOrDefault();

如果你经常这样做,辅助函数会使其稍微不那么冗长:

T FromObject<T>(object o) where T : struct  return (o as T?).GetValueOrDefault(); 

然后

decimal unitPrice = FromObject<decimal>(row["UnitPrice"]);

如果你需要一个非零的默认值:

T FromObject<T>(object o, T defaultValue) where T : struct

    return (o as T?).GetValueOrDefault(defaultValue);

然后

decimal unitPrice = FromObject<decimal>(row["UnitPrice"], Decimal.MinValue);

这种方法的缺点是,如果您更改数据库列的基础类型,您将开始得到虚假零而不是异常。这是因为如果对象例如是1.2f,那么o as decimal? 将返回null,然后将其替换为0.0m。但是,o == DBNull.Value ? 0.0m : (decimal)o 表达式将等效于 (decimal)(object)1.2f,这将失败并出现 InvalidCastException,这比免费赠送您的所有产品要好。

【讨论】:

【参考方案2】:

decimal 是值类型,不能是null。您可以仅使用 ?? 运算符和 reference types. 您可以继续使用第一种方式,也可以执行以下操作:

decimal UnitPrice = (object)row["UnitPrice"] ?? default(decimal)

【讨论】:

以上是关于如何将 collasce null 运算符与 DbNull.Value 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

DB--运算符

DB-MySQL:MySQL NULL 值处理

我想如何将 db 与 vs 连接?

将常量与空集进行比较时,Db2 IN 谓词产生 NULL

如何使用 Spring JDBC Framework 将“null”时间戳插入 DB2 数据库

DB-MySQL:MySQL 运算符