Ошибка - переполнение 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");
По-прежнему такая же ошибка, странная часть заключается в том, что вышеупомянутый трюк работал на первую вставку в БД, но с этого не удался. Любые идеи, что происходит?
Ответы
Ответ 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