行が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}
実際のメリットはありません。読みやすい方を使用してください。
それらの間の特定の違いに関して、基本的な答えはIsNull
、列内の特定のレコードのnull状態を照会することです。を使用== DBNull.Value
すると、実際に値が取得され、実際にnullの場合は置換が行われます。つまり、IsNull
実際に値を取得せずに状態をチェックするため、(少なくとも理論的には)わずかに高速になります。
カスタムストレージタイプを使用する場合、理論的には列がnull値以外のものを返す可能性がありますが、これは(私の経験では)決して行われません。DBNull.Value
この場合IsNull
、ストレージタイプが以外のものを使用した場合を処理しますDBNull.Value
が、繰り返しになりますが、これが行われるのを見たことがありません。
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のみをチェックする場合は、明示的にそのように言って使用することです。
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"));
}
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)と相関させない限り、サイコロはありません。
これにより、テーブルの行にチェックnull値が含まれるようになります
if (! DBNull.Value.Equals(dataset.Tables["tablename"].Rows[n][0].ToString())) {
//enter code here
} else {
//enter code here
}