Поиск нулевого значения в наборе данных - метод DataRow.IsNull vs == DbNull.Value - c # - PullRequest
15 голосов
/ 08 апреля 2011

Каковы преимущества использования c # метода 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}

Ответы [ 5 ]

22 голосов
/ 11 апреля 2011

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

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

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

8 голосов
/ 08 апреля 2011

DBNull.Value != null

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

, если вы установите значение NULL или DBNull.Value, тогда вы захотите использовать IsNull().Это возвращает true, если значение равно нулю или 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 голосов
/ 08 апреля 2011

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

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

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


}
0 голосов
/ 28 октября 2012

Это дает таблице проверочное нулевое значение в строках

if (! DBNull.Value.Equals(dataset.Tables["tablename"].Rows[n][0].ToString())) {
    //enter code here
} else {
  //enter code here
}
0 голосов
/ 08 апреля 2011

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 для числовых типов), которым я не являюсь.

...