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

.net 应使用IsDBNull和IsNull中的哪一个?,.net,vb.net,null,dbnull,.net,Vb.net,Null,Dbnull,如果在VB.NET中我有DataRow,并且我想测试列值是否为Null,我应该使用: myDataRow.IsNull("Column1") 或 我总是使用myDataRow.IsNullColumn1,因为在发出SELECT时,如果值为null,则返回null而不是DBNull。使用IsDBNull IsNull与IsDBNull略有不同。一个检查所用数据库中的DB Null值,另一个检查为Null。处理数据行数据时,最好使用IsDBNull函数。IsDBNull的优点是它检查对象是否表示n

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

myDataRow.IsNull("Column1")

我总是使用myDataRow.IsNullColumn1,因为在发出SELECT时,如果值为null,则返回null而不是DBNull。

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

处理数据行数据时,最好使用IsDBNull函数。IsDBNull的优点是它检查对象是否表示null,而不是检查对象本身是否为null,这是一个重要的区别。当查询数据库中为空的数据行项时,该项本身作为对象存在,但它表示空值。如果您使用IsNull,您将丢失NULL值。

.NET几乎不会意外地为您提供两种执行相同操作的方法。DataRow.IsNull效率更高,它避免了检索列值然后检查IsDBNull。在内部,它已经跟踪列是否为null,这是在创建行时确定的。所以IsNull可以很快给你这个。因此,这应该是您的偏好

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

长回答:你需要阅读C代码来理解这部分;MS提供C语言的框架代码,但是VB程序员应该能够大致了解正在发生的事情

下面是DataRow的IsNull调用中发生的情况:

column.IsNull执行快速断言,并将调用转发给内部类DataStorage:

internal bool IsNull(int record) {
    Debug.Assert(null != _storage, "no storage");
    return _storage.IsNull(record);
}
最后,以下是_storage.IsNull的作用:

由于dbNullBits是一个位数组,因此此操作完成得非常快

现在考虑索引器MyDATABOLILN1在调用其结果到ISBULNUL:

之前调用这个索引器的方法吗?
请注意,IsNull方法和索引器的前两行是相同的。但是,后面的三行需要执行验证,并获取值本身。只有在这之后,您的代码才能开始计算其目标值——一个告诉代码该值是否为DBNull的标志。这需要更多的计算,但更重要的是,每次执行检查时都需要一些计算。这比使用预先计算的值要慢。

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

我做了一些发现,发现了一些有趣的事实,这些事实提供了关于DataRow.IsNull或IsDBNull用法的更多见解

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

参考资料:及

提供明确结论的最有趣的讨论可以从

之前也进行过类似的讨论,以下是参考资料:


为什么SELECT语句返回null?所有其他SQL语句是否返回DBNull?@CJ7,当它放入属性或数据行时,它被封送为null。我认为您给出的两个示例在功能上是相同的
public bool IsNull(string columnName) {
    DataColumn column = GetDataColumn(columnName);
    int record = GetDefaultRecord();
    return column.IsNull(record);
}
internal bool IsNull(int record) {
    Debug.Assert(null != _storage, "no storage");
    return _storage.IsNull(record);
}
public virtual bool IsNull(int recordNo) {
    return this.dbNullBits.Get(recordNo);
}
get {
    DataColumn column = GetDataColumn(columnName);
    int record = GetDefaultRecord();
    _table.recordManager.VerifyRecord(record, this);
    VerifyValueFromStorage(column, DataRowVersion.Default, column[record]);
    return column[record];
}