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)