应该使用 IsDBNull 还是 IsNull?

24 浏览
0 Comments

应该使用 IsDBNull 还是 IsNull?

在VB.NET中,如果我有一个DataRow并且想要测试一个列的值是否为Null,我应该使用哪个方法:

myDataRow.IsNull("Column1")

还是

IsDBNull(myDataRow("Column1"))

0
0 Comments

在使用DataRow的IsNull和Convert.IsDBNull时,我进行了一些研究,发现了一些有趣的事实,这些事实更深入地解释了它们的用法。DataRow.IsNull用于判断指定的DataColumn是否包含空值。Convert.IsDBNull用于判断指定的对象是否为DBNull类型。在以下引用中可以找到更多信息:DataRow.IsNull 和 IsDBNull。

最有趣的讨论可以从性能考虑中得出明确的结论。先前进行过类似的讨论,以下是一些参考链接:

- Finding null value in dataset datarow isnull...

- Most efficient way to check for dbnull...

- Avoid checking for datarow isdbnull...

根据这些讨论的结论,可以得出以下解决方法和原因:

问题的出现原因:使用IsNull和IsDBNull的性能问题。

解决方法:根据性能考虑,有以下解决方法:

1. 使用IsNull进行空值判断可以提高性能。

2. 避免在每个列上都使用IsDBNull进行空值判断,可以使用IsNull进行整个行的空值判断。

这些讨论和解决方法为我们在使用DataRow的IsNull和Convert.IsDBNull时提供了更多的洞察力和指导。

0
0 Comments

在使用DataRow对象时,有两种方法可以检查指定列的值是否为DBNull,即IsDBNullIsNull方法。那么在这两种方法中,应该使用哪一种呢?

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

长篇回答:需要阅读C#代码才能理解这一部分。Microsoft提供了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的标志。这需要更多的计算,并且更重要的是,它需要每次执行检查时进行一些计算。这比使用预先计算的值要慢。

为了获得更快的结果,应该使用IsDBNull方法。这个方法使用了预先计算的结果,而IsNull方法需要每次调用时动态重新计算。

0
0 Comments

在.NET中,很少有两种不同的方式可以无意中完成同样的事情。 DataRow.IsNull()更高效,它避免了必须检索列值然后检查是否为IsDBNull的过程。内部它已经跟踪了列是否为空,这是在行创建时确定的。因此,IsNull()可以非常快速地给出结果。因此,应该优先使用IsNull()。

原因:

.NET提供了两种方法来检查一个值是否为空:IsDBNull和IsNull。这两种方法都可以用于检查数据库中的空值。然而,由于它们的实现方式不同,它们的性能也有所不同。这就导致了"Which of IsDBNull and IsNull should be used?"这个问题的出现。

解决方法:

根据上面提到的原因,应该优先使用IsNull()方法。这是因为IsNull()方法更高效,它避免了检索列值的过程,直接返回结果。而IsDBNull()方法需要先检查列值是否为DBNull,然后才能确定是否为空。因此,使用IsNull()方法可以提高代码的性能。

以下是使用IsNull()方法的示例代码:

if (row.IsNull("ColumnName"))

{

// Column is null

}

else

{

// Column is not null

}

通过使用IsNull()方法,我们可以直接检查列是否为空,并根据需要执行相应的操作。这样可以简化代码,并提高代码的可读性和性能。

总之,当需要检查数据库中的空值时,应优先使用IsNull()方法。它是更高效的方法,可以直接返回结果,避免了额外的检查过程。这样可以提高代码的性能,并且使代码更简洁和易于理解。

0