8

Class PersonプロパティのBirthdaynull 許容 DateTime として定義しましたか? では、次の例で null 合体演算子が機能しないのはなぜですか?

cmd.Parameters.Add(new SqlParameter("@Birthday",
   SqlDbType.SmallDateTime)).Value =       
     person.Birthday ?? DBNull.Value; 

私が得たコンパイラ エラーは「演算子 '??' でした。タイプ「System.DateTime?」のオペランドには適用できません。および「System.DBNull」」

以下もコンパイルエラーになりました:

cmd.Parameters.Add(new SqlParameter("@Birthday", 
  SqlDbType.SmallDateTime)).Value = 
   (person.Birthday == null) ? person.Birthday:DBNull.Value;

リファクタリングで推奨されているように (オブジェクト) にキャストを追加し、コンパイルしましたが、正しく動作せず、値は両方の場合で sqlserver db に null として格納されました。

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;
4

3 に答える 3

22

問題は、DateTime?DBNull.Valueが同じ型ではないため、null 合体演算子を使用できないことです。

あなたの場合、タイプの値をperson.Birthday ?? (object)DBNull.Valueに渡すことができますobjectAdd()

于 2010-08-06T15:27:06.630 に答える
4

クエリを実行する直前にパラメータを繰り返し処理し、必要に応じてnullのすべてのインスタンスをDBNullに変更します。次に例を示します。

foreach (IDataParameter param in cmd.Parameters)
    if (param.Value == null)
        param.Value = DBNull.Value;

これにより、null値をそのままにして、後でまとめて交換することができます。

于 2010-08-06T16:16:57.037 に答える
3

最初の問題は、??or?:演算子の場合、いずれかを選択するオブジェクトが同じ型でなければならないことです。ここでは、それらは異なるタイプです。

于 2010-08-06T15:29:12.260 に答える