Какой из IsDBNull и IsNull следует использовать? - программирование
Подтвердить что ты не робот

Какой из IsDBNull и IsNull следует использовать?

Если в VB.NET у меня есть DataRow, и я хочу проверить, имеет ли значение столбца Null, следует ли использовать:

myDataRow.IsNull("Column1")

ИЛИ

IsDBNull(myDataRow("Column1"))
4b9b3361

Ответ 1

Короткий ответ: используйте первый способ, это быстрее, потому что первый метод использует предварительно вычисленный результат, а второй метод должен перепрограммировать его на лету каждый раз, когда вы его вызываете.

Длинный ответ: (вам нужно прочитать код С#, чтобы понять эту часть: MS поставляет код рамки на С#, но программисты 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, эта операция выполняется очень быстро.

Теперь рассмотрим, что делает indexer 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 или нет. Это требует большего количества вычислений, но, что более важно, для выполнения проверки требуется несколько вычислений. Это медленнее, чем использование предварительно вычисленного значения.

Ответ 2

.NET почти никогда не дает вам два способа сделать одно и то же случайно. DataRow.IsNull() более эффективен, он позволяет избежать необходимости получать значение столбца, а затем проверять IsDBNull. Внутренне он уже отслеживает, является ли столбец нулевым, определяемым при создании строки. Так IsNull() может дать вам это очень быстро. Поэтому это должно быть ваше предпочтение.

Ответ 3

Я немного поработал и нашел интересные факты, которые дают больше информации об использовании DataRow.IsNull OR IsDBNull.

DataRow.IsNull - получает значение, указывающее, содержит ли указанный DataColumn нулевое значение. Convert.IsDBNull - возвращает указание, имеет ли указанный объект тип DBNull.

Ссылки: DataRow.IsNull и IsDBNull

Самое интересное обсуждение, которое дает четкий вывод, можно сделать из Рассмотрение производительности

Почти аналогичное обсуждение было сделано ранее, здесь приведены ссылки:

Поиск нулевого значения в наборе данных datarow isnull...

Самый эффективный способ проверить dbnull...

Избегайте проверки datarow isdbnull...

Ответ 4

Я всегда использовал бы myDataRow.IsNull("Column1"), потому что при выдаче SELECT, если значение null, оно возвращается как null, а не DBNull.

Ответ 5

Используйте IsDBNull IsNull немного отличается от IsDBNull. Один проверяет значение DB Null из используемой базы данных, а другой, ну, просто Null.

Ответ 6

При работе с данными DataRow он идеален для использования функции IsDBNull(). Преимущество IsDBNull() состоит в том, что он проверяет, является ли ваш объект нулевым, а не просто нулевым, и что это важное различие. Когда вы запрашиваете элемент строки данных, который является нулевым в базе данных, сам элемент существует как объект, но он представляет значение NULL. Если вы используете IsNull(), вы пропустите значения NULL.

Ответ 7

Из дизайна и использования базы данных IsNull является правильным и принятым способом опроса значения столбца на основе использования различных технологий баз данных, включая SQL, DB2, OLAP, MOLAP, RDBMS, MDBMS, SPSS, Essbase и т.д. По определению Null - это отсутствие значения, неизвестность, а Null даже не равно Null, поэтому любое дополнение к Null - это просто вопрос удобства.