48

DateTime?使用してフィールドに挿入しようとしているものがありDbParameterます。私は次のようにパラメータを作成しています:

DbParameter datePrm = updateStmt.CreateParameter();
datePrm.ParameterName = "@change_date";

そして、 sを考慮しながらDateTime?の値をwhileに入れたいと思います。dataPrm.Valuenull

私は最初は賢いと思いました:

datePrm.Value = nullableDate ?? DBNull.Value;

しかし、それはエラーで失敗します

演算子'??' タイプ「System.DateTime?」のオペランドには適用できません。および「System.DBNull」

したがって、2番目の引数が最初の引数のnull許容でないバージョンである場合にのみ機能すると思います。それで私は行きました:

datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value;

しかし、それも機能しません:

'System.DateTime'と'System.DBNull'の間に暗黙の変換がないため、条件式のタイプを判別できません。

しかし、私はそれらのタイプ間で変換したくありません!

これまでのところ、私が仕事に取り掛かることができるのは次のとおりです。

if (nullableDate.HasValue)
  datePrm.Value = nullableDate.Value;
else
  datePrm.Value = DBNull.Value;

それは本当に私がこれを書くことができる唯一の方法ですか?三項演算子を使用してワンライナーを機能させる方法はありますか?

更新:なぜ私は本当にわかりませんか?バージョンが機能しません。MSDNによると:

?? 演算子は、nullでない場合は左側のオペランドを返し、そうでない場合は右側のオペランドを返します。

それがまさに私が欲しいものです!

Update2:それは最終的には明らかでした:

datePrm.Value = nullableDate ?? (object)DBNull.Value;
4

6 に答える 6

64

あはは!@Trebzよりもさらに効率的なソリューションを見つけました!

datePrm.Value = nullableDate ?? (object)DBNull.Value;
于 2008-10-20T15:49:20.123 に答える
6

SQLServer を使用している場合、System.Data.SqlTypes名前空間には面倒な型キャストを回避するいくつかのユーティリティ クラスが含まれています。たとえば、これの代わりに:

var val = (object) "abc" ?? DBNull.Value;

あなたはこれを書くことができます:

var val = "abc" ?? SqlString.Null;
于 2015-03-25T14:23:14.227 に答える
5

あなたが使用した場合、それは動作します

datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : DBNull.Value;
于 2008-10-20T15:36:09.430 に答える
5

C# 3.0 を使用している場合は、これを簡単に行うための拡張メソッドを作成できます。

public static class DBNullableExtensions
{
    public static object ToDBValue<T>(this Nullable<T> value) where T:struct
    { 
        return value.HasValue ? (object)value.Value : DBNull.Value;
    }
}


class Program
{
    static void Main(string[] args)
    {
        int? x = null;

        Console.WriteLine(  x.ToDBValue() == DBNull.Value );
    }
}
于 2008-10-20T15:40:04.057 に答える
1

2回目の試行でのエラーは、 nullableDate.Value と DBNull.Value が異なる型であり、三項演算子がどちらの場合も返すために1つの型を選択する必要があるためだと思います。これをテストする環境はありませんが、これはうまくいくと思います:

datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : (object)DBNull.Value;
于 2008-10-20T15:36:13.033 に答える
0

私がそれを行う方法は、パラメータ値がnullであるかどうかを確認するだけの静的ユーティリティクラスを持っていることです.DBNullを実行するように値を設定します. 実行を呼び出す前にそれを行います。

于 2008-10-20T15:38:11.393 に答える