質問

NULL の列をフェッチする Oracle データテーブルがあります。そこで、コードをわかりやすくシンプルに保つために、?? を使用すると思います。オペランド。AlternatePhoneNumber は C# モデルの文字列です。

AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""

ただし、そのコードを使用してもまだエラーが発生します。

System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.

エラーの意味はわかっていますが、なぜですか??DBNullでは使えないのでしょうか?null と DBNull は本質的に同じではないでしょうか?

ありがとう。

役に立ちましたか?

解決

?? 演算子は実際のものにのみ適用されます nulls.

null そして DBNull.Value 同じではありません。 DBNull.Value は単なるプレースホルダー オブジェクトです。

また、その例外は内部から発生しています。 AlternatePhoneNumber 財産、あなたの前に ?? オペレーターが実行します。(コードにはキャストがありません)。

もし customer 型付きデータセット内の行である場合は、列の行を変更します NullValue デザイナーのプロパティ。

他のヒント

nullとdbnullは同じではありません。System.DBNullは実際のオブジェクトです。

問題はAlternatePhoneNumberが文字列であることです。dbnullはそうではありません。

代わりにこれを試してみてください:

AlternatePhoneNumber = (customer.AlternatePhoneNumber as string) ?? ""
.

これを行う:

public T IfNull<T>(object o, T value)
{
   return (o == DbNull.Value) ? value : (T)o;       
}
.

dbnullは単一の値を持つタイプで、NULL文字列参照と同じではありません。これが??を使用できない理由です。あなたはこれを行うことができます:

string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;
.

他の返信状態として、nullとは、ADO.CETAGCODEがADO.NETからを参照しているクラスで、フィールドまたは値がデータベースでNULL(またはIN)である場合に、を示すクラスです。データベース可能な)

条件(三項)演算子を使用することができる。(?:) あなたが望むものをする:

AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull 
                           ? "" 
                           : customer.AlternatePhoneNumber;
.

これを拡張方式

static class NullExtensions
{
    public static T WhenNull<T>( this object value, T whenNullValue )
    {
        return (value == null || value is DBNull)
            ? whenNullValue
            : (T)value;
    }
}
.

私が見つけたものはコードを読みやすく理解しやすくします。

AlternatePhoneNumber = customer.AlternatePhoneNumber.WhenNull( "" );
.

dbnullは実際の "null"ではありません。

「?」 - オペレータは、「NULL」動作をエミュレートするオブジェクトではなく、NULL - 参照のみを検出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top