空值的处理

3
今天我在调试代码时遇到了一个奇怪的情况。
如截图所示,我从一个 `System.Data.OracleClient` 的 `ExecuteScalar()` 方法中获取了一个对象 `obj` 的值。
将该值赋给变量 `obj`,但它明显显示为空,但执行却进入了一个 `if (obj != null)` 语句,这在技术上不应该发生。有什么想法吗?我想知道我是否编写的代码正确? enter image description here
3个回答

10

2
obj 是否真的是 DBNull.Value?在屏幕截图中,我看到了 IsNull 和 Value 属性。 - Dirk
这就是混淆的原因。 - hiFI
1
@Dirk 澄清一下:如果一个值真的是 null,那么它根本没有任何属性。它只会在单行中显示 obj 的值为 null - DrCopyPaste
@DrCopyPaste,DBNull.Value没有IsNull或Value属性。实际上,我下面的答案回答了关于返回类型的问题。 - Dirk

4

DBNull.Value可以使用,

null不是任何类型的实例,它是一个无效的引用。

然而,System.DbNull.Value是对System.DbNull类的一个有效引用(System.DbNull是单例模式,System.DbNull.Value给您提供了对该类的单个实例的引用),表示数据库中不存在的值。


1

ExecuteOracleScalar的文档说明它"执行查询,并将查询返回的结果集中第一行的第一列作为Oracle特定数据类型返回。"

据我所知,结果可能是例如OracleNumber,它具有您的屏幕截图显示的IsNullValue属性。


你的解释是正确的。我运行了 SQL,但没有返回任何行,技术上是一个空值。SQL 应该返回一个 OracleNumber 值,但 ExecuteOracleScalar() 返回了一个 OracleNumber 类型,其 Value 属性为 null,因为没有行。 - hiFI

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