.net 应使用IsDBNull和IsNull中的哪一个?
如果在VB.NET中我有DataRow,并且我想测试列值是否为Null,我应该使用:.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
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];
}