Переполнение DateTime.MinValue и SqlDateTime
Я не хочу проверять txtBirthDate
, поэтому я хочу передать DateTime.MinValue
в базу данных.
Мой код:
if (txtBirthDate.Text == string.Empty)
objinfo.BirthDate = DateTime.MinValue;
else
objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text);
DateTime.MinValue
return Date = {1/1/0001 12:00:00 AM}
У меня возникла ошибка SQL:
Переполнение SqlDateTime. Должно быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM.
Я понимаю это, но я не понимаю, почему DateTime.MinValue
возвращает недопустимое время даты, которое невозможно вставить в базу данных. Как справиться с этим типом ситуации?
Ответы
Ответ 1
В принципе, не используйте DateTime.MinValue
для представления отсутствующего значения. Вы не можете использовать DateTime.MinValue
в поле DateTime SQL Server, так как SQL Server имеет минимальное значение начала 1753.
Вместо этого создайте свойство BirthDate
a Nullable<DateTime>
(aka DateTime?
) и установите его null
, если у вас нет значения. Также убедитесь, что поле базы данных имеет значение NULL. Тогда вам просто нужно убедиться, что этот null
заканчивается как значение null
в базе данных. Именно то, как вы это сделаете, будет зависеть от вашего доступа к данным, о котором вы нам ничего не сказали.
Ответ 2
Очень просто не использовать DateTime.MinValue
вместо System.Data.SqlTypes.SqlDateTime.MinValue
.
Ответ 3
Хотя это старый вопрос, другим решением является использование datetime2 для столбца базы данных.
Ссылка MSDN
Ответ 4
Вот что вы можете сделать. Хотя есть много способов добиться этого.
DateTime? d = null;
if (txtBirthDate.Text == string.Empty)
objinfo.BirthDate = d;
else
objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text);
Примечание. Это будет работать только в том случае, если столбец datetime базы данных имеет значение Allow Null. Кроме того, вы можете определить стандартное минимальное значение для DateTime d.
Ответ 5
Я использую эту функцию для tryparse
public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate)
{
bool valid = false;
tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
System.Data.SqlTypes.SqlDateTime sdt;
if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate))
{
try
{
sdt = new System.Data.SqlTypes.SqlDateTime(tryDate);
valid = true;
}
catch (System.Data.SqlTypes.SqlTypeException ex)
{
}
}
return valid;
}
Ответ 6
Из MSDN:
Данные о дате и времени с 1 января 1753 года по 31 декабря 9999 года с точность одной трехсотой секунды или 3,33 миллисекунды. Значения округлены до приращений .000,.003 или .007 миллисекунд. Хранится как два 4-байтовых целых числа. Первые 4 байта содержат количество дней до или после базовой даты, 1 января 1900 года. Базовая дата - это контрольная дата системы. Значения для даты и времени до 1 января, 1753, не допускаются. Остальные 4 байта сохраняют время суток представленный как число миллисекунд после полуночи. Секунды допустимый диапазон 0-59.
SQL использует другую систему, чем С# для значений DateTime.
Вы можете использовать свой MinValue в качестве контрольного значения - и если это MinValue - передать null в ваш объект (и сохранить дату как NULL в базе данных).
if(date == dateTime.Minvalue)
objinfo.BirthDate = null;
Ответ 7
Проще говоря, не использовать DateTime.MinVaue
как значение по умолчанию.
Здесь есть несколько различных MinValues
, в зависимости от того, в какой среде вы находитесь.
У меня когда-то был проект, где я реализовал проект Windows CE, я использовал Framework DateTime.MinValue
(год 0001), базу данных MinValue
(1753) и элемент управления пользовательского интерфейса DateTimePicker
(я думаю, это 1970). Таким образом, было по крайней мере 3 разных MinValues , которые приводили к странному поведению и неожиданным результатам. (И я считаю, что была даже четвертая (!) Версия, я просто не помню, откуда она взялась.).
Используйте нулевое поле базы данных и вместо этого измените значение на Nullable<DateTime>
. Если в вашем коде нет допустимого значения, в базе данных должно быть значение not.: -)
Ответ 8
Ну... довольно просто получить минимальную дату SQL
DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue.Value;
Ответ 9
Если вы используете DATETIME2, вы можете обнаружить, что вам нужно передать параметр именно как DATETIME2, в противном случае он может помочь преобразовать его в DATETIME и иметь такую же проблему.
command.Parameters.Add("@FirstRegistration",SqlDbType.DateTime2).Value = installation.FirstRegistration;
Ответ 10
использовать расширения
public static class DateTimeExtensions
{
public static DateTime MinValue(this DateTime sqlDateTime)
{
return new DateTime(1900, 01, 01, 00, 00, 00);
}
}
DateTime date = DateTime.Now;
Console.WriteLine("Minvalue is {0} ", date.MinValue().ToShortDateString());