トップ回答者
DateTime に初期値をセットするとエラー「加算または減算された値は表現できない DateTime になります。」

質問
-
お世話になります。
表題の通り、DateTime に初期値をセットしてDBに書き込もうとするとエラーが出ます。
「加算または減算された値は表現できない DateTime になります。\r\nパラメーター名:value」
コードは下記の通り
DbAccessClass.doubleCheck.ShindanBi2 = DateTime.MaxValue; DbAccessClass.doubleCheck.ShindanBi3 = DateTime.MaxValue; DbAccessClass.doubleCheck.EditDate2 = DateTime.MaxValue; DbAccessClass.doubleCheck.EditDate3 = DateTime.MaxValue; : try { // FalcoTable への書き込み /////////////////// SqlDataAdapter adapter = new SqlDataAdapter(); // select用コマンド・オブジェクトの作成 SqlCommand selectCmd = new SqlCommand(); selectCmd.Connection = con; selectCmd.CommandText = sqlSelect; // データアダプタの作成 adapter.SelectCommand = selectCmd; // データセットへの読み込み System.Data.DataSet ds = new System.Data.DataSet(); adapter.Fill(ds, "xxxxxCheckTable"); // データの追加 System.Data.DataTable dt = ds.Tables["xxxxxCheckTable"]; System.Data.DataRow newRow = dt.NewRow(); // 主キーの設定 dt.PrimaryKey = new System.Data.DataColumn[] { dt.Columns["hyohon"] }; newRow["hyohon"] = id; : newRow["ShindanBi2"] = doubleCheck.ShindanBi2; newRow["ShindanBi3"] = doubleCheck.ShindanBi3; newRow["EditDate2"] = doubleCheck.EditDate2; newRow["EditDate3"] = doubleCheck.EditDate3; dt.Rows.Add(newRow); } // コマンド自動作成 SqlCommandBuilder cb = new SqlCommandBuilder(adapter); // データベースの更新 int num = adapter.Update(ds, "User7BmlDoubleCheckTable"); <- ここでエラーが出る
DateTime は、初期値のみでDBに書き込もうとしています。
ちなみに、DateTime.MinValue も試しましたが、MinValue は01/01/01 になるので日付の範囲外(値が小さすぎる)と言われます。
よろしくお願いします。
Windows 10 C# 2015 WinForm
回答
-
エラーメッセージはデータベース側から返されたものではなく、.NET Framework 側で発せられているようにみえます。
たとえば以下のコードを実行すれば、先のエラーメッセージを再現できますね。
DateTime dt1 = DateTime.MaxValue.AddSeconds(1.0); DateTime dt2 = DateTime.MinValue.AddSeconds(-1.0);
// FalcoTable への書き込み ///////////////////SqlDataAdapter adapter = new SqlDataAdapter();‘FalcoTable` がどんなものであるのは分かりませんが、クラス名からして SQL Server をご利用でしょうか。
SQL Server の日付型 には何種類かあり、それぞれ、表せる範囲と精度が異なります。たとえば datetime2 型であれば、.NET の DateTime 型と同等に扱えますが、smalldatetime 型の場合には DateTime.MaxValue は明らかに大きすぎるでしょう。
データベース側で扱っているのはどのデータ型なのか、そしてその型の精度と範囲は想定内であるかどうかを確認してみてください。
- 回答としてマーク ferret001 2019年3月29日 3:22
すべての返信
-
エラーメッセージはデータベース側から返されたものではなく、.NET Framework 側で発せられているようにみえます。
たとえば以下のコードを実行すれば、先のエラーメッセージを再現できますね。
DateTime dt1 = DateTime.MaxValue.AddSeconds(1.0); DateTime dt2 = DateTime.MinValue.AddSeconds(-1.0);
// FalcoTable への書き込み ///////////////////SqlDataAdapter adapter = new SqlDataAdapter();‘FalcoTable` がどんなものであるのは分かりませんが、クラス名からして SQL Server をご利用でしょうか。
SQL Server の日付型 には何種類かあり、それぞれ、表せる範囲と精度が異なります。たとえば datetime2 型であれば、.NET の DateTime 型と同等に扱えますが、smalldatetime 型の場合には DateTime.MaxValue は明らかに大きすぎるでしょう。
データベース側で扱っているのはどのデータ型なのか、そしてその型の精度と範囲は想定内であるかどうかを確認してみてください。
- 回答としてマーク ferret001 2019年3月29日 3:22
-
英語のフォーラムに同様のご質問があがっておりました。
https://social.msdn.microsoft.com/Forums/en-US/da1a07cc-aacc-46e3-bdeb-5079e4e90603
回避方法としては、DateTime.MaxValue から数日前の日付を使う方法が案内されておりました。参考になりますでしょうか。