Поиск нулевого значения в Dataset - метод DataRow.IsNull vs == DbNull.Value - С# - программирование
Подтвердить что ты не робот

Поиск нулевого значения в Dataset - метод DataRow.IsNull vs == DbNull.Value - С#

В чем преимущества использования метода С# DataRow.IsNull для определения нулевого значения при проверке, равна ли строка DbNull.value?

if(ds.Tables[0].Rows[0].IsNull("ROWNAME")) {do stuff}

против

if(ds.Tables[0].Rows[0]["ROWNAME"] == DbNull.value) {do stuff}
4b9b3361

Ответ 1

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

Что касается конкретных различий между ними, основным ответом является то, что IsNull запрашивает нулевое состояние для конкретной записи в столбце. Использование == DBNull.Value действительно извлекает значение и делает замену в том случае, если оно фактически является нулевым. Другими словами, IsNull проверяет состояние без фактического извлечения значения и, следовательно, немного быстрее (теоретически, по крайней мере).

Теоретически возможно, чтобы столбец возвращал значение, отличное от DBNull.Value, для нулевого значения, если вы использовали специальный тип хранилища, но это никогда не делается (по моему опыту). Если бы это было так, IsNull обработало бы случай, когда тип хранилища использовал нечто, отличное от DBNull.Value, но, опять же, я никогда не видел этого.

Ответ 2

DBNull.Value != null

DBNull.Value обозначает столбец со значением <NULL>. Поп открыть таблицу и вернуть несколько строк, посмотрите, содержит ли какой-либо столбец в любой строке значение <NULL> (ctrl 0). Если вы видите тот, который эквивалентен DBNull.Value.

если вы установите значение null или DBNull.Value, тогда вы захотите использовать IsNull(). Это возвращает true, если значение равно null или DBNull.Value. Рассмотрим следующее:

row["myCol"] = null;

row["myCol"] = DBNull.Value

if (row["myCol"] == DBNull.Value)//возвращает true

if (row["myCol"] == null)//возвращает false

if (row.IsNull("myCol"))//возвращает true

Дело в том, что если вы просто проверяете значение null или DBNull.Value, используйте IsNull, если вы только проверяете DBNull.Value, явным образом скажу это и использую это.

Ответ 3

Для одного это меньше печатает. Кроме того, я думаю, что они эквивалентны.

Чтобы попытаться выяснить, почему я говорю, что они эквивалентны.

[Test()]
public void test() {
    var t = new System.Data.DataTable();
    t.Columns.Add("col1");
    var r = t.NewRow();

        // null is converted to DBNull.Value by DataRow
        r["col1"] = null;
        Assert.IsFalse(r["col1"] == null);
        Assert.IsTrue(r["col1"] == DBNull.Value);
        Assert.IsTrue(r.IsNull("col1"));

        // nullable types w/o values are also converted
        int? val = null;
        Assert.IsFalse(val.HasValue);
        r["col1"] = val;
        Assert.IsTrue(r["col1"] == DBNull.Value);
        Assert.IsTrue(r.IsNull("col1"));


}

Ответ 4

FWIW, я написал кучу методов расширения DataRow — CastAsXXX() — чтобы избежать необходимости иметь дело с нулевым значением БД... или хотя бы отложить его немного B ^). Здесь мои методы CastAsInt() и CastAsIntNullable():

#region downcast to int

public static int CastAsInt( this DataRow row , int index )
{
  return toInt( row[index] ) ;
}
public static int CastAsInt( this DataRow row , string columnName )
{
  return toInt( row[columnName] ) ;
}

public static int? CastAsIntNullable( this DataRow row , int index )
{
  return toIntNullable( row[index] );
}
public static int? CastAsIntNullable( this DataRow row , string columnName )
{
  return toIntNullable( row[columnName] ) ;
}

#region conversion helpers

private static int toInt( object o )
{
  int value = (int)o;
  return value;
}

private static int? toIntNullable( object o )
{
  bool hasValue = !( o is DBNull );
  int? value    = ( hasValue ? (int?) o : (int?) null ) ;
  return value;
}

#endregion conversion helpers

#endregion downcast to int

Использование довольно простое. Вам просто нужно высказать свои ожидания.

DataRow dr = GetADataRowFromSomewhere() ;
// Throws NullReferenceException if the column is null
int     x  = dr.CastAsInt(         "column_1" ) ;
// Is perfectly happy with nulls (as it should be)
int?    y  = dr.CastAsIntNullable( "column_1" ) ;

Я попытался сделать их обобщенными, но не кубиками, если я не хочу сопоставлять NULL из базы данных со значением по умолчанию для типа (например, 0 для числовых типов), чего я не знаю.

Ответ 5

Он дает таблице проверить значение null в строках

if (! DBNull.Value.Equals(dataset.Tables["tablename"].Rows[n][0].ToString())) {
    //enter code here
} else {
  //enter code here
}