Ошибка - переполнение SqlDateTime. Должен быть между 01.01.1753 0:00:00 и 31.12.9999 23:59:59

71
задан Drew Noakes 16 August 2010 в 23:21
поделиться

4 ответа

DateTime в C# тип значения, не ссылочный тип, и поэтому не может быть пустым. Это может однако быть константа DateTime.MinValue, который является вне диапазона SQL-серверов 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-сервер 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");

(Transact-SQL) MSDN datetime2

76
ответ дан Robert Paulson 24 November 2019 в 12:56
поделиться

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

dc.Log = Console.Out;

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

существует пара способов иметь дело с этим:

  • Удостоверяются, что Вы инициализируете все времена даты со значением, которое может обработать SQL (такие как 0 Sql: 01.01.1900)
  • Удостоверяются любые времена даты, которые могут иногда опускаться, nullable datetimes
9
ответ дан Amy B 24 November 2019 в 12:56
поделиться

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

1
ответ дан Turnkey 24 November 2019 в 12:56
поделиться

Sometimes in order to write less code it is used to have SQL server set fields like date, time and ID on insert by setting the default value for fields to GETDATE() or NEWID().

In such cases Auto Generated Value property of those fields in entity classes should be set to true.

This way you do not need to set values in code (preventing energy consumption!!!) and never see that exception.

3
ответ дан 24 November 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: