行が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
以外の何かotherを返す可能性がありますが、これは(私の経験では)決して行われていません。この場合、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、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)と相関させない限り、サイコロはありません。
これにより、テーブルの行にチェックnull値が含まれます。
if (! DBNull.Value.Equals(dataset.Tables["tablename"].Rows[n][0].ToString())) {
//enter code here
} else {
//enter code here
}