web-dev-qa-db-ja.com

データセットでnull値を見つける-DataRow.IsNullメソッドvs == DbNull.Value-c#

行がDbNull.valueと等しいかどうかをチェックするよりも、c#メソッドDataRow.IsNullを使用してnull値を決定することの利点は何ですか?

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

vs

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

実際の実用的なメリットはありません。読みやすい方を使用してください。

それらの間の特定の違いに関して、基本的な答えは、IsNullが列内の特定のレコードのnull状態を照会することです。 == DBNull.Valueを使用すると、実際に値が取得され、実際にnullの場合は置換が行われます。言い換えると、IsNullは実際に値を取得せずに状態をチェックするため、(少なくとも理論的には)わずかに高速になります。

カスタムストレージタイプを使用する場合、理論的には、列がnull値に対してDBNull.Value以外の何かotherを返す可能性がありますが、これは(私の経験では)決して行われていません。この場合、IsNullはストレージタイプがDBNull.Value以外のものを使用した場合を処理しますが、繰り返しになりますが、これが行われるのを見たことがありません。

22
Adam Robinson

_DBNull.Value != null_

DBNull.Valueは、値_<NULL>_を持つ列を表します。テーブルを開いていくつかの行を返します。任意の行の列に_<NULL>_(ctrl 0)値が含まれているかどうかを確認します。 DBNull.Valueと同等のものが表示された場合。

値をnullまたはDBNull.Valueに設定する場合は、IsNull()を使用する必要があります。値がnullまたはDBNull.Valueの場合、trueを返します。次のことを考慮してください。

_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のみをチェックする場合は、明示的にそのように言って使用することです。

8
JonH

1つは、タイピングが少ないことです。それ以外は同等だと思います。

なぜそれらが同等であると私が言うのかを明確にするために。

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


}
3
Seth Reno

FWIW、DBのnull可能性に対処する必要をなくすために、一連のDataRow拡張メソッド— CastAsXXX() —を作成しました...または少なくとも少し延期します^)。これが私の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)と相関させない限り、サイコロはありません。

0
Nicholas Carey

これにより、テーブルの行にチェックnull値が含まれます。

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