2

datetimeSQL Server 2008 Expressで列を更新しているときに、例外が発生しました。

eventinfo.StartDateTime = DateTime.ParseExact(start, 
                                              "MM/dd/yyyy hh:mm tt", 
                                              CultureInfo.InvariantCulture);
db.Entry(eventinfo).State = EntityState.Modified;
db.SaveChanges();

例外:

datetime2データ型をdatetimeデータ型に変換した結果、値が範囲外になりました。ステートメントは終了しました。

この例外を回避する方法はありますか?

4

1 に答える 1

3

Sql Server の日付/時刻データ型のドメインは次のとおりです。

  • datetime2(100 ナノ秒の精度) 1753-01-01T00:00:00.0 — 9999-12-31T23:59:59.9999999。
  • datetime(ミリ秒の精度...一種) 1753-01-01T00:00:00.000 — 9999-12-31T23:59:59.997
  • smalldatetime(1 秒の精度) 1900-01-01T00:00:00 — 2079-06-06T23:59:59

CLRDateTime構造体の精度も 100 ナノ秒です。エポック (0001-01-01T00:00:00) からの 100 秒ティックのカウントです。そのドメインは 0001-01-01T00:00:00 — 9999-12-31T23:59:59.9999999 です。

DateTimeSQL Server の と比較して、CLR の拡張ドメインに気付くでしょうdatetime2

CLR のデフォルト値DateTimeはそのエポック (0001-01-01T00:00:00) です。1753-01-01T00:00:00 より前の値は、範囲外の例外をスローします。

おそらく、DateTime値が何らかの形で初期化されていないか、DateTime.ParseExact() がジャンク データを取得して解析に成功し、1753-01-01 より前の日付/時刻になってしまう可能性があります。

于 2012-08-03T19:12:36.317 に答える