【发布时间】:2013-07-07 01:08:45
【问题描述】:
如果在VB.NET 我有DataRow 并且我想测试列值是否为Null,我应该使用:
myDataRow.IsNull("Column1")
或
IsDBNull(myDataRow("Column1"))
【问题讨论】:
-
我认为你给出的两个例子在功能上是相同的
如果在VB.NET 我有DataRow 并且我想测试列值是否为Null,我应该使用:
myDataRow.IsNull("Column1")
或
IsDBNull(myDataRow("Column1"))
【问题讨论】:
我将始终使用myDataRow.IsNull("Column1"),因为在发出SELECT 时,如果值为null,则返回为null 而不是DBNull。
【讨论】:
null 会为SELECT 语句返回?是否为所有其他 SQL 语句返回 DBNull?
使用IsDBNull
IsNull 与 IsDBNull 略有不同。一个检查使用的数据库中的 DB Null 值,另一个检查 Null。
【讨论】:
在处理 DataRow 数据时,最好使用 IsDBNull() 函数。 IsDBNull() 的优点是它检查您的对象是否表示 null,而不是简单地为 null 本身,这是一个重要的区别。当您查询数据库中为空的数据行项目时,项目本身作为对象存在,但它表示一个 NULL 值。如果你使用 IsNull() 你会错过 NULL 值。
【讨论】:
.NET 几乎从不会意外地为您提供两种方法来做同样的事情。 DataRow.IsNull() 更有效,它避免了必须检索列值然后检查 IsDBNull。在内部,它已经跟踪列是否为空,由创建行时确定。所以 IsNull() 可以很快地为您提供非常。因此,它应该是您的偏好。
【讨论】:
短答案:使用第一种方式,它更快,因为第一个方法使用预先计算的结果,而第二种方法每次调用它时需要在飞行中重新计算它。
长答案 :(你需要读取c#代码来理解这一部分; MS在C#中提供框架代码,但VB程序员应该能够获得发生的事情的一般想法)
这是在IsNull 987654322 @:
public bool IsNull(string columnName) {
DataColumn column = GetDataColumn(columnName);
int record = GetDefaultRecord();
return column.IsNull(record);
}
column.IsNull 执行快速断言,并将调用转发到内部类 DataStorage:
internal bool IsNull(int record) {
Debug.Assert(null != _storage, "no storage");
return _storage.IsNull(record);
}
最后,_storage.IsNull 做了什么:
public virtual bool IsNull(int recordNo) {
return this.dbNullBits.Get(recordNo);
}
自dbNullBits是BitArray,这个操作非常快速完成。
现在考虑索引器myDataRow("Column1") dome(在将结果传递给IsDBNull)之前(您调用此索引器):
get {
DataColumn column = GetDataColumn(columnName);
int record = GetDefaultRecord();
_table.recordManager.VerifyRecord(record, this);
VerifyValueFromStorage(column, DataRowVersion.Default, column[record]);
return column[record];
}
注意IsNull 方法的前两行和索引器是相同的。但是,接下来的三行需要执行验证,并获取值本身。只有在此之后,您的代码可以开始计算其目标值 - 仅在其中表示值为DBNull @ @ @ @ @ @的标志。这需要更多的计算,但更重要的是,每次执行检查时都需要一些计算。这比使用预先计算的值要慢。
【讨论】:
从数据库设计和使用的角度来看,IsNull 是询问列值的正确且公认的方法,它基于各种数据库技术的使用,包括 SQL、DB2、OLAP、MOLAP、RDBMS、MDBMS、SPSS、 Essbase 等。根据定义,Null 是不存在值、未知数,并且 Null 甚至不等于 Null,因此 Null 的任何附加只是为了方便。
【讨论】:
我做了一些调查,发现了一些有趣的事实,这些事实可以更深入地了解 DataRow.IsNull 或 IsDBNull 的用法。
DataRow.IsNull - 获取一个值,该值指示指定的 DataColumn 是否包含空值。 Convert.IsDBNull - 返回指定对象是否为 DBNull 类型的指示。
参考:DataRow.IsNull 和 IsDBNull
提供明确结论的最有趣的讨论可以来自Performance Consideration
之前已经进行了几乎类似的讨论,以下是参考:
Finding null value in dataset datarow isnull...
【讨论】: