Подтвердить что ты не робот

Переполнение 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 возвращает недопустимое время даты, которое невозможно вставить в базу данных. Как справиться с этим типом ситуации?

4b9b3361

Ответ 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());