C#の? null合体演算子の質問
-
26-09-2019 - |
質問
私がなぜnullは、次の例ではオペレータの作業を合体べきではない、の NULL可能日時?のように、クラスの人のプロパティの誕生日を定義しています?
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? DBNull.Value;
私が得たコンパイラerrが 『??』「演算子ましたタイプのオペランドに適用することはできません「のSystem.DateTime?」そして、 'System.DBNull'」
次のようにも、コンパイルエラーが発生しました
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
(person.Birthday == null) ? person.Birthday:DBNull.Value;
リファクタリングによって推奨されているように、私は(オブジェクト)にキャストを追加し、それがコンパイルされますが、正常に動作しませんでしたし、値は両方のケースでヌルとしてのSQLServerのDBに格納されていました。
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? (object)DBNull.Value;
缶誰かがここで起こっているかを説明しますか?
私は、次の不器用なコードを使用するために必要なます:
を if (person.Birthday == null)
cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value
= DBNull.Value;
else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value =
person.Birthday;
解決
問題は、あなたがそれらの作業を合体ヌルを使用することはできませんのでDateTime?
とDBNull.Value
が同じタイプではないということです。
あなたはperson.Birthday ?? (object)DBNull.Value
に至る型object
の値を渡すためにAdd()
を行うことができますあなたのケースでは、
他のヒント
私は例えば、適切にはDBNullにヌルのすべてのインスタンスを変更し、クエリを実行する前に、私のパラメータを反復処理することを好むます:
foreach (IDataParameter param in cmd.Parameters)
if (param.Value == null)
param.Value = DBNull.Value;
この私は、あるとしてnull値のままにし、単に後で一斉にそれらを交換することができます。
あなたの最初の問題は??
または?:
オペレータのために、いずれかの選択のためのオブジェクトが同じタイプでなければならないということです。ここでは、それらは異なるタイプです。
所属していません StackOverflow