SqlDateTimeOverflow例外で、Dapper更新プログラムでのnull可能なDateTimeフィールド

dapper sql-server

質問

私はNULL値を持つ複数のDateTimeフィールドを持つdbテーブルを持っています。これらは、クラス内のnull可能なDateTimesにマップされます。

Dapperを使用してデータ層内で更新を実行しようとすると、次のようになります。

 using (IDbConnection cnn = new SqlConnection(DB.getConString()))
 {
    cnn.Open();
    return cnn.Execute((this.OptionID == 0 ? _insertSQL : _updateSQL), this);              
 }

SqlDateTimeOverflow例外が発生します(DateTimeフィールドはNULLではなく'01 / 01/0001 00:00:00 'なので)。

これを回避する唯一の方法は、個々のパラメータを個別に指定し、値をnullに切り替えることです。

 using (IDbConnection cnn = new SqlConnection(DB.getConString()))
 {
    cnn.Open();
    return cnn.Execute("UPDATE MyTable SET MyDateField = @MyDateField", new {MyDateField = (MyDateField.HasValue? MyDateField : Null), etc etc... );

私はテーブルに約50のフィールドを持っていますので、これはかなりコードになります。同様に更新するINSERTメソッドもあります。私が紛失している簡単な構文はありますか?

受け入れられた回答

ここでの問題は、 01/01/0001 00:00:00は「null値」ではないということです。 DateTime?を使用していた場合はDateTime?私はそれがうまくいっただろうと思う。しかし、私はまた、 DateTime.MinValueがnull値を表すために(主に.NET 1.1にnullable構造体がないために)使用されていることを認識しなければなりません。私の推奨する提案は、単にDateTime?使用することDateTime? 。最小値マップは、SQL最小値(1753年1月1日)ではなく自動的にマップする必要があるかどうかを検討する場合もあるため、少し複雑です。

更新ステートメントを再 - おそらくmin-valueとnullの間にマップする拡張メソッドを追加しますか?

public static DateTime? NullIfZero(this DateTime when) {
    return when == DateTime.MinValue ? (DateTime?)null : when;
}

使用する:

new { MyDateField = MyDateField.NullIfZero() }

しかし、 MyDateFieldDateTime?場合は再びDateTime? 、あなたはちょうど使用することができます:

new { MyDateField }


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ