Ошибка - переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 31.129999 11:59:59 - PullRequest
68 голосов
/ 22 января 2009

Я использовал этот фрагмент кода, который я написал, и он работает самым непонятным образом. Я хочу вставить строку в базу данных, которая включает в себя два столбца DateTime:

myrow.ApprovalDate = DateTime.Now
myrow.ProposedDate = DateTime.Now

И все же, когда я обновляю базу данных, я получаю эту ошибку:

Переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 31.129999 11:59:59 вечера.

Я даже пытался скопировать вставленное значение из базы данных и жестко закодировать его в обновляемый объект:

// I copied this value from the DB
myrow.ApprovalDate =  Convert.ToDateTime("2008-12-24 00:00:00.000");

Все та же ошибка, странная часть в том, что описанная выше уловка сработала для первой вставки в БД, но не с этого момента. Есть идеи, что происходит?

Ответы [ 12 ]

74 голосов
/ 22 января 2009

A DateTime в C # является типом значения, а не ссылочным типом, и поэтому не может быть нулевым. Однако это может быть константа DateTime.MinValue, которая находится вне диапазона типа данных Sql Servers DATETIME.

Типы значений гарантированно всегда будут иметь (по умолчанию) значение (ноль) без необходимости явной установки (в данном случае DateTime.MinValue).

Вывод: у вас, вероятно, есть неустановленное значение DateTime, которое вы пытаетесь передать в базу данных.

DateTime.MinValue = 1/1/0001 12:00:00 AM
DateTime.MaxValue = 23:59:59.9999999, December 31, 9999, 
                    exactly one 100-nanosecond tick 
                    before 00:00:00, January 1, 10000

MSDN: DateTime.MinValue


Относительно Sql Server

Дата и время
Данные о дате и времени с 1 января 1753 года по 31 декабря 9999 года с точностью до одной сотой секунды (эквивалентно 3,33 миллисекунды или 0,00333 секунды). Значения округляются с шагом .000, .003 или .007 секунд

smalldatetime
Дата и время с 1 января 1900 года по 6 июня 2079 года с точностью до минуты. значения smalldatetime с 29,998 секундами или ниже округляются до ближайшей минуты; значения с 29,999 секунд или выше округляются до ближайшей минуты.

MSDN: Sql Server DateTime и SmallDateTime


Наконец, если вы передаете C # DateTime в виде строки в sql, вам необходимо отформатировать его следующим образом, чтобы сохранить максимальную точность и не дать серверу sql выдать похожую ошибку.

string sqlTimeAsString = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");

Обновление (8 лет спустя)

Рекомендуется использовать тип данных sql DateTime2, который лучше соответствует .net DateTime с диапазоном дат 0001-01-01 through 9999-12-31 и диапазоном времени 00:00:00 through 23:59:59.9999999

string dateTime2String = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffffff");

MSDN datetime2 (Transact-SQL)

67 голосов
/ 17 декабря 2010

Я нахожу, что использование следующих работ довольно хорошо для дат мин / макс SQL после многих ошибок, связанных с БД:

DateTime rngMin = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;

DateTime rngMax = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue;
9 голосов
/ 09 августа 2011

Остерегайтесь при сравнении .Net DateTime с SqlDateTime.MinValue или MaxValue. Например, следующее вызовет исключение:

DateTime dte = new DateTime(1000, 1, 1);
if (dte >= SqlDateTime.MinValue)
    //do something

Причина в том, что MinValue возвращает SqlDateTime, а не DateTime. Таким образом .Net пытается преобразовать dte в SqlDateTime для сравнения и, поскольку он находится за пределами допустимого диапазона SqlDateTime, выдает исключение.

Одним из решений этой проблемы является сравнение вашего DateTime с SqlDateTime.MinValue. Значение .

9 голосов
/ 22 января 2009

Код для двух столбцов выглядит нормально. Ищите любые другие столбцы даты и времени в этом классе отображения. Также включите ведение журнала в текстовом данных, чтобы увидеть запрос и параметры.

dc.Log = Console.Out;

DateTime инициализируется значением c #, равным 0001-01-01. Это передается linqtosql в базу данных через строковый литерал sql: «0001-01-01». Sql не может разобрать дату и время T-Sql с этой даты.

Есть несколько способов справиться с этим:

  • Убедитесь, что вы инициализируете все время даты значением, которое может обработать SQL (например, Sql's 0: 1900-01-01)
  • Убедитесь, что любое время даты, которое иногда может быть пропущено, обнуляемо datetimes
6 голосов
/ 05 августа 2014

Эта ошибка возникает, если вы пытаетесь установить переменную типа DateTime в null . Объявите переменную как nullable, то есть DateTime? . Это решит проблему.

3 голосов
/ 17 декабря 2009

Иногда для написания меньшего количества кода используется SQL-сервер, который устанавливает поля, такие как дата, время и идентификатор, при вставке, устанавливая значение по умолчанию для полей GETDATE() или NEWID().

В таких случаях Автоматически сгенерированное значение свойство этих полей в классах сущностей должно быть установлено в true.

Таким образом, вам не нужно устанавливать значения в коде (предотвращая потребление энергии !!!), и вы никогда не увидите это исключение.

1 голос
/ 13 января 2016

Использовать метод расширения

 public static object ToSafeDbDateDBnull(this object objectstring)
    {
        try
        {
            if ((DateTime)objectstring >= SqlDateTime.MinValue)
            {
                return objectstring;
            }
            else
            {
                return DBNull.Value;
            }
        }
        catch (Exception)
        {

            return DBNull.Value;
        }

    }

DateTime objdte = new DateTime(1000, 1, 1);
dte.ToSafeDbDateDBnull();
1 голос
/ 22 января 2009

Это обычно означает, что в запрос отправляется пустое значение вместо желаемого значения, вы можете попробовать запустить SQL Profiler, чтобы точно узнать, что передается в SQL Server из linq.

0 голосов
/ 30 августа 2013

DateTime.MinValue и DateTime.MaxValue

DateTime.MinValue = 1/1/0001 12:00:00 AM

DateTime.MaxValue = 23:59:59.9999999, December 31, 9999, 

                exactly one 100-nanosecond tick 

                before 00:00:00, January 1, 10000 
0 голосов
/ 21 августа 2013

Обычно такого рода ошибки возникают при выполнении преобразования или анализа DateTime. Проверьте настройки календаря на сервере, на котором размещено приложение, в основном часовой пояс и формат короткой даты, и убедитесь, что для него задан правильный часовой пояс. Надеюсь, что это решит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...