質問

私がなぜ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値のままにし、単に後で一斉にそれらを交換することができます。

あなたの最初の問題は??または?:オペレータのために、いずれかの選択のためのオブジェクトが同じタイプでなければならないということです。ここでは、それらは異なるタイプです。

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