16

行が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}
4

5 に答える 5

23

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

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

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

于 2011-04-11T16:57:20.337 に答える
8

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

于 2011-04-08T18:41:17.470 に答える
4

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


}
于 2011-04-08T18:43:01.853 に答える
0

FWIW、私はたくさんのDataRow拡張メソッドを作成しました— —DBのnull可能性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)と相関させない限り、サイコロはありません。

于 2011-04-08T18:53:54.480 に答える
0

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

if (! DBNull.Value.Equals(dataset.Tables["tablename"].Rows[n][0].ToString())) {
    //enter code here
} else {
  //enter code here
}
于 2012-10-28T07:38:38.503 に答える