应该使用IsDBNull和IsNull中的哪一个?

时间:2013-07-09 12:21:19

标签: .net vb.net null dbnull

如果我在VB.NET DataRow并且我想测试列值是否为Null,我应该使用:

myDataRow.IsNull("Column1")

OR

IsDBNull(myDataRow("Column1"))

7 个答案:

答案 0 :(得分:18)

简短回答:使用第一种方式,速度更快,因为第一种方法使用预先计算的结果,而第二种方法需要在每次调用时动态重新计算。

长答案 :(您需要阅读C#代码才能理解这一部分; MS在C#中提供框架代码,但VB程序员应该能够全面了解正在发生的事情)

以下是IsNull DataRow来电中发生的事情:

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);
}

由于dbNullBitsBitArray,因此此操作非常快速地完成。

现在考虑索引器myDataRow("Column1")的作用(在将结果传递给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。这需要更多的计算,但更重要的是,每次执行检查时都需要进行一些计算。这比使用预先计算的值慢。

答案 1 :(得分:8)

.NET几乎从未给你两种方法来偶然地做同样的事情。 DataRow.IsNull()更有效,它避免了必须检索列值然后检查IsDBNull。在内部,它已经跟踪列是否为空,在创建行时确定。因此,IsNull()可以快速为您提供非常。因此,应该是你的偏好。

答案 2 :(得分:2)

我做了一些调查结果,发现了有趣的事实,提供了对DataRow.IsNull OR IsDBNull使用情况的更多见解。

DataRow.IsNull - 获取一个值,该值指示指定的DataColumn是否包含空值。 Convert.IsDBNull - 返回指定对象是否为DBNull类型的指示。

参考文献:DataRow.IsNullIsDBNull

最有趣的讨论可以从Performance Consideration

中得出明确的结论

之前几乎有类似的讨论,这里有参考文献:

Finding null value in dataset datarow isnull...

Most efficient way to check for dbnull...

Avoid checking for datarow isdbnull...

答案 3 :(得分:1)

处理DataRow数据时,最好使用IsDBNull()函数。 IsDBNull()的优势在于它检查你的对象是否代表一个null,而不是简单地为null本身,这是一个重要的区别。当您询问数据库中为空的数据行项时,该项本身作为对象存在,但它表示NULL值。如果你使用IsNull(),你将错过NULL值。

答案 4 :(得分:1)

从数据库设计和使用的角度来看,IsNull是基于使用各种数据库技术(包括SQL,DB2,OLAP,MOLAP,RDBMS,MDBMS,SPSS)来查询列值的正确且可接受的方式。 Essbase等。根据定义,Null是缺少值,未知,Null甚至不等于Null,因此任何Null的附件都只是为了方便。

答案 5 :(得分:0)

我会一直使用myDataRow.IsNull("Column1"),因为在发出SELECT时,如果值为null,则会返回null而不是DBNull

答案 6 :(得分:0)

使用IsDBNull IsNull与IsDBNull略有不同。一个用于检查所用数据库的DB Null值,另一个检查Null。