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

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

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

vs

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

5 ответов


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

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

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


DBNull.Value != null

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

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

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.Значение use IsNull, если вы проверяете только DBNull.Value явно говорит так и использует это.


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

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

[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"));


}

FWIW, я написал кучу методов расширения DataRow -CastAsXXX() - чтобы избежать необходимости иметь дело с DB nullability...или по крайней мере отложить его немного б^). Вот мой 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" ) ;

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


это дает таблице имеет значение check null в строках

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