値はクラスオブジェクトのデータベースから割り当てられるため、10進数がNULLであるか、何らかの値を持っているかどうかを確認したいと思います。
public decimal myDecimal{ get; set; }
そして、私は持っています
myDecimal = Convert.ToDecimal(rdrSelect[23].ToString());
やっています:
if (rdrSelect[23] != DBNull.Value)
{
myDecimal = Convert.ToDecimal(rdrSelect[23].ToString());
}
しかし、私はこれを取得しています:
タイプ 'decimal'の値がnullと決して等しくないため、式の結果は常に 'true'です。
その10進数に値があるかどうかを確認するにはどうすればよいですか?
小数には常にデフォルト値があります。 nullable type decimalが必要な場合は、decimal?
を使用できます。その後、myDecimal.HasValue
を実行できます
このコードを使用できます
if (DecimalVariable.Equals(null))
{
//something statements
}
decimal
は value type
.NETで。また、値の型をnull
にすることはできません。ただし、 nullable type
decimal
の場合、decimal
がnull
であるかどうかを確認できます。 myDecimal?
Nullable型は、System.Nullable構造体のインスタンスです。 null許容型は、その基になる値型の値の通常の範囲に加えて、追加のnull値を表すことができます。
if (myDecimal.HasValue)
しかし、あなたのデータベースでは、この列にnull許容値が含まれている場合、それはdecimal
のタイプではないはずです。
あなたがデータ行から読み込んでいると仮定すると、あなたが望むのは:
if ( !rdrSelect.IsNull(23) )
{
//handle parsing
}
Decimalは値型であるため、初期化された値(ゼロ)以外の値があるかどうかを確認する場合は、myDecimal!= default(decimal)の条件を使用できます。
それ以外の場合は、null許容(10進数?)型の使用とmyNullableDecimal.HasValueなどの条件の使用を検討する必要があります。
DbからDataTable
オブジェクトからnullの10進数を取得しようとしたときに、この問題に最近遭遇しましたが、ここではこの答えを見ていません。私はこれが簡単で短いと思います:
var value = rdrSelect.Field<decimal?>("ColumnName") ?? 0;
私の場合、モデルにNULL可能な10進数はありませんでしたが、1に対してすばやくチェックする必要があるため、これは役に立ちました。 db値がnullである場合、デフォルト値を割り当てます。
この値をSQLデータベースから直接取得していて、そこの値がnullの場合、実際にはnullではなくDBNull
オブジェクトになります。変換の前にチェックを配置し、DBNull
のイベントでデフォルト値を使用するか、nullチェックをDBNull
のrdrSelect[23]
のチェックに置き換えます。
また、このような場合にDBからの値を処理する便利なユーティリティ関数を作成することもできます。例以下は、オブジェクトタイプからNullable Decimalを提供する関数です。
public static decimal? ToNullableDecimal(object val)
{
if (val is DBNull ||
val == null)
{
return null;
}
if (val is string &&
((string)val).Length == 0)
{
return null;
}
return Convert.ToDecimal(val);
}