如果我在VB.NET
DataRow
并且我想测试列值是否为Null
,我应该使用:
myDataRow.IsNull("Column1")
OR
IsDBNull(myDataRow("Column1"))
答案 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);
}
由于dbNullBits
是BitArray
,因此此操作非常快速地完成。
现在考虑索引器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.IsNull和IsDBNull
最有趣的讨论可以从Performance Consideration
中得出明确的结论之前几乎有类似的讨论,这里有参考文献:
Finding null value in dataset datarow isnull...
答案 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。