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

  • 質問

  • お世話になります。

    表題の通り、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

    2019年3月28日 7:33

回答

  • エラーメッセージはデータベース側から返されたものではなく、.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
    2019年3月28日 8:14
  • 現在検証環境がないので情報だけですが、下記のURLにmin値、max値のサンプルコードがありました。参考になりますでしょうか。

    https://stackoverflow.com/questions/4147239/smalldatetime-min-and-max-values-in-c-sharp

    • 回答としてマーク ferret001 2019年3月29日 3:22
    2019年3月28日 8:58

すべての返信

  • エラーメッセージはデータベース側から返されたものではなく、.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
    2019年3月28日 8:14
  • 英語のフォーラムに同様のご質問があがっておりました。

    https://social.msdn.microsoft.com/Forums/en-US/da1a07cc-aacc-46e3-bdeb-5079e4e90603

    回避方法としては、DateTime.MaxValue から数日前の日付を使う方法が案内されておりました。参考になりますでしょうか。

    2019年3月28日 8:20
  • 魔界の仮面弁士様、kenjinote 様お世話になります。

    > smalldatetime  型の場合には DateTime.MaxValue は明らかに大きすぎるでしょう。

    DB側の設定は書きませんでしたが、まさにDB側は、smalldatetime を使用しています。

    これが原因としてどのような値を初期値としてセットすればいいでしょうか?

    おしえてください。

    2019年3月28日 8:27
  • 現在検証環境がないので情報だけですが、下記のURLにmin値、max値のサンプルコードがありました。参考になりますでしょうか。

    https://stackoverflow.com/questions/4147239/smalldatetime-min-and-max-values-in-c-sharp

    • 回答としてマーク ferret001 2019年3月29日 3:22
    2019年3月28日 8:58
  • 遅くなりました。

    教えていただいたように日付の最小値を変えて初期値とすることでうまく行きました。

    ありがとうございました。

    2019年3月29日 3:21