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
Код Вы имеете для взглядов на два столбца хорошо. Ищите любые другие столбцы даты и времени на том классе отображения. Кроме того, позвольте войти в систему datacontext для наблюдения запроса и параметров.
dc.Log = Console.Out;
DateTime инициализируется к 0 c# - который является 01.01.01. Это передается linqtosql к базе данных через sql строковый литерал: '0001-01-01'. Sql не может проанализировать дату и время T-Sql с этой даты.
существует пара способов иметь дело с этим:
Это обычно означает, что пустой указатель отправляется на запрос вместо Вашего требуемого значения, Вы могли бы попытаться выполнить SQL Profiler для наблюдения точно, что становится переданным SQL Server от linq.
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.