2011-06-17 38 views
9

我有一点混淆以下的事情:当我们必须在C#.Net中使用DBNull.Value,null和“”时,

  1. DBNull.Value
  2. “”

当我使用条件语句或在分配值,我有点有点与这些东西混淆。有时它会抛出错误,并且有时它会起作用。我想知道我什么时候想要使用上述的东西。它们是否与数据类型有关?我需要你的宝贵建议。

回答

13

null是两件事情之一:

  • 一点不实际上指向一个对象的引用 - 只是一个“无”指标(本质上,它是作为一种参考价值0
  • 一个Nullable<T>结构,它目前还没有一个值(HasValue属性也将返回false

DBNull是特定于ADO.NET的某些部分来代表数据库中的null。我还没有想到一个很好的理由,他们为什么不在这里使用正规的null

""是一个长度为零的字符串 - 一个完全有效但空的字符串。其意义在于null字符串和""字符串之间,像value.Trim()这样的实例方法的行为将有所不同; null.Trim()会抛出异常; "".Trim()只是""。一般来说,使用string.IsNullOrEmpty(value)作为测试使这种区别消失。

+0

+1:我对DBNull的原因没有任何第一手知识,但我发现它有助于区分内存中的空对象(这对我来说是不好的)和适当的空值数据库(我需要)。我相信他们可以将它构建为对两者都使用null,但我发现这种区别很有用。 –

+0

@Joel够公平的;可悲的是,我从来没有过。这只是一件要记住的事情......'param.Value = value ?? DBNull.Value;'等 –

+0

@MarcGravell当它有用时,是在SqlCommand.ExecuteScalar的返回值中。当结果集有零行时返回null。至少有一行时返回DBNull.Value,但第一列的数据库为NULL。 –

12
  • null是语言的内部,只是意味着对象引用当前不引用实际的对象。基本上,值类型(int,bool等)和引用类型(Object,任何类等)之间的关键区别在于,值类型是内存中的具体值,引用类型是指向对象表示的指针在记忆中。这个指针有时候可以指向什么也没有。在这种情况下,它是null。它基本上意味着“这里没有C#对象存在”。

  • DBNull.Value与使用数据库的目的略有不同。数据库列可以包含一个null值。但是,在代码中将这些数据选入对象(如DataTable)时,的一个对象,只要涉及代码即可。但是,该对象包含来自数据库的null值的表示。因此,存在DBNull.Value来表示该区别。它基本上意味着“这里有一个C#对象,它从数据库中获取了一个值,但该值为null。”

  • “”(或string.Empty如果您想使用内置常量)是一个有效值。它存在,它不是null,它在各方面都是string。它只是没有任何字符。一个有用的工具来检查这是string.IsNullOrEmpty()其中检查null或空字符串。

+1

“所以你不必在内存中实例化一个新的字符串来保存任何东西” - 实习会使得这非常不切实际。我不会强调''“''和'string.Empty'之间的差别。 –

+0

@Marc Gravell:没错,在这一点上它已经非常好的优化了。我想,老宠物尿尿很难死。 – David

1

null适用于C#空值。

System.DBNull.value适用于数据库特定的NULL值。

当您使用ExecuteScalar()时,如果列未找到或返回,则返回null,但找到列并且值为null,则返回DBnull,如果值为null,则返回DBnull,否则返回DBnull。

相关问题