SqlDateTimeオーバーフロー。 1753年1月1日午前0時から12月31日午後11時59分59秒の間に必要です
ウェブサイトから更新操作を行う際にエラーが何度も出て、XMLの設定かSQL文の実行時に何か問題が起きたのかと思いました
SQLクエリアナライザーを使って生成されたSQL文を取得しようとしたところ、正しい実行に何が問題なのか分かりました。 SQL文は以下の通りです:
執行sp_executesql DBOに挿入。 LeanLogs(バージョン、OrganizationId、CustomInfoId、LastLeanAlarmType、nowLeanAlarmType、InsertTime、TreatedTime) 値(@p0、@p1、@p2、@p3、@p4、@p5、@p6); 選択 SCOPE_IDENTITY()',N'@p0 int,@p1 int,@p2 int,@p3 int,@p4 int,@p5 DateTime,@p6 DateTime',@p0=1,@p1=35,@p2=12,@p3=10,@p4=10,@p5='2017-09-13 13:09:41',@p6=NULL SqlDateTimeオーバーフロー。 解決は1753年1月1日午前0時0分00秒から12月31日11時59分59秒の間に必ず---されなければなりません
エラーの原因
データベースに渡される時間タイプの値がNULLの場合、またはDateTime.MinValueの挿入や更新時に、datetimeフィールドの値はデフォルトでnullとなります。 ここでのNULLはプログラムコード内のnullを指し、多くの場合、時間型変数がプログラム内で定義され、値を割り当てずにデータベース(またはストアドプロシージャ)に渡される場合です。 この時点で、この変数の値はデフォルトで01/01/01に割り当てられています。 データベースのDateTimeタイプフィールドの最小値は1/1/1/1753 12:00:00であり、 NET FrameworkのDateTime型では、最小値は1/1/0001 0:00:00です。これはSQL値の最小値範囲外であり、データオーバーフローエラーを引き起こします。 では、C#で.netとsqlの最大最小時間を確認する方法を見てみましょう。
出力効果:
結局、10分以上もいじった。
最終的な誤差原因は以下の通りです。
オブジェクトの属性タイプの一つもオブジェクトであり、テーブルに外部キーがあり、新しいdatetime属性が外部キーテーブルに追加されますが、この属性は値が割り当てられず、nullable型にも設定されていません
オブジェクトを追加または更新する際、.netのデフォルト値の時刻がデータベースのデフォルト最小時間より短いため、外部キーオブジェクトのdatetimeが自動的にデフォルト値に付加されます
解決策:外来キーオブジェクトのdatetime型のプロパティをnullable typeに設定し、同僚が完璧に解決できるよう助けましょう!
|