3

nullの列をフェッチするOracleデータテーブルがあります。だから私はコードを素晴らしくシンプルに保つために私が使用するだろうと思います?? オペランド。AlternativePhoneNumberは、私のC#モデルの文字列です。

AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""

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

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

エラーの意味はわかっていますが、なぜですか?DBNullでは使用できませんか?nullとDBNullは本質的に同じではありませんか?

ありがとうございました。

4

7 に答える 7

15

演算子は実際の??にのみ適用されnullます。

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

また、その例外は、演算子が実行AlternatePhoneNumberされる前に、プロパティ内から発生しています。??(コードにはキャストがありません)。

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

于 2010-07-09T13:43:15.517 に答える
3

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

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

AlternatePhoneNumber = (customer.AlternatePhoneNumber as string) ?? ""
于 2010-07-09T13:45:39.850 に答える
3

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

于 2010-07-09T13:43:45.280 に答える
2

DBNullは単一の値を持つ型であり、null文字列参照と同じではないため、を使用することはできません??。ただし、これは可能です。

string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;
于 2010-07-09T13:46:01.467 に答える
2

これを行う:

public T IfNull<T>(object o, T value)
{
   return (o == DbNull.Value) ? value : (T)o;       
}
于 2010-07-09T13:49:22.083 に答える
1

DBNull は実際の「null」ではありません。

「??」- 演算子は null - 参照のみを検出し、「null」動作をエミュレートするオブジェクトは検出しません。

于 2010-07-09T14:05:56.957 に答える
1

他の応答状態として、nullはオブジェクトを参照しない参照を意味し、はデータベース (または DataTable) でフィールドまたは値が NULL であることを示すためDBNullにADO.NET によって提供されるクラスです。

条件付き (三項) 演算子 (?:)を使用して、必要なことを行うことができます。

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( "" );
于 2010-07-09T13:50:57.107 に答える