Подтвердить что ты не робот

Ошибка - переполнение SqlDateTime. Должно быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM

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

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

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

Переполнение SqlDateTime. Должно быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM.

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

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

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

4b9b3361

Ответ 1

A DateTime в С# - тип значения, а не ссылочный тип и поэтому не может быть нулевым. Однако он может быть константой 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

Дата и время
Данные даты и времени с 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


Наконец, если вы обнаружите, что передаете С# 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)

Ответ 2

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

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

DateTime rngMax = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue;

Ответ 3

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

dc.Log = Console.Out;

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

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

  • Убедитесь, что вы инициализируете все даты со значением, которое может обрабатывать SQL (например, Sql 0: 1900-01-01)
  • Удостоверьтесь, что время, которое иногда может быть опущено, nullable datetime

Ответ 4

Остерегайтесь при сравнении .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. Значение.

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Я вижу то же самое. Ошибка не возникает при вставке строки, а в обновление. таблица, на которую я ссылаюсь, имеет два столбца DateTime, ни один из которых не имеет значения NULL.

Я получил сценарий до получения строки и сразу же сохранил ее (никаких изменений данных). Функция get работает нормально, но обновление не работает.

Мы используем NHibernate 3.3.1.4000

Ответ 9

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

Ответ 10

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

 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();

Ответ 11

Если u, используя NHibernate ORM, проверьте, что файлы Datetime уступают Nullable, а в файлах ur NHibernate Map установлены значение nullable.

У меня была эта проблема и много раз пробовал проверить все коды и наконец найти ее.

Ответ 12

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