Возникли проблемы с DateTime (преобразование типа данных datetime2 приводит к выходу за пределы диапазона) - PullRequest
0 голосов
/ 01 мая 2018

Я получаю эту ошибку:

"Преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона.
Оператор был прерван."

Представление, взаимодействующее с пользователями, имеет следующий соответствующий код:

@Html.LabelFor(model => model.BirthDate)
@Html.TextBoxFor(model => model.BirthDate, new { size = "50", @type = "date", @class = "AddMemberControls" })

Текстовое поле, в которое пользователь должен ввести дату, говорит «мм / дд / гггг» (и показывает календарь, где пользователь может выбрать дату)

Метод контроллера выглядит следующим образом:

public ActionResult AddMember(string firstName, string lastName, DateTime birthDate, int age, string sportType)
{            
    var member = new Member() { FirstName = firstName, LastName = lastName, Age = age, SportType = sportType, BirthDate = birthDate };

    coloContext.Members.Add(member);
    coloContext.SaveChanges();  

    return View();
}

И модель:

[Column(TypeName = "datetime2")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime BirthDate { get; set; } 

Если, например, пользователь выбирает дату 05/01/18, то при отладке и проверке параметра даты рождения он говорит: 01-May-18 12:00:00 AM

Полагаю, проблема в том, что он пишет "May", а база данных не знает, как его сохранить?

Я вижу, что в Интернете много об этой проблеме, и несколько попыток найти решение, но, к сожалению, ни одна из них не сработала для меня.

Я пробовал:

Добавить аннотацию с типом столбца

[Column(TypeName = "datetime2")]

Создание Datime nullabe в моей модели (какие предложено несколько решений). Но это решение не имеет большого смысла для меня. Особенно, когда я знаю, что этот параметр не может быть нулевым

public DateTime? BirthDate { get; set; }

Пытался разобрать DateTime, надеясь, что он избавится от "мая". Хотя, если возможно, я бы хотел, чтобы дата была сохранена в этом формате.

DateTime test = DateTime.parse(birthDate.ToString())

Некоторые предлагали изменить на DateTime2, но нет объекта с именем DateTime2? Я все равно попробовал, но получил ошибку на этом

public DateTime2 BirthDate { get; set; }

И еще несколько решений, которые я забыл.

1 Ответ

0 голосов
/ 01 мая 2018

Из сообщения об ошибке совершенно ясно, что тип данных в фактической таблице базы данных не DateTime2, а DateTime.

Эти типы данных отличаются допустимым диапазоном (между прочим).

Допустимый диапазон значений DateTime2 - от 0001-01-01 до 9999-12-31
(С 1 января 2001 года по 31 декабря 9999 года)
в то время как допустимый диапазон от DateTime составляет всего от 1753-01-01 до 9999-12-31
(С 1 января 1753 года по 31 декабря 9999 года). (бонусное чтение: Почему? )

Существует множество причин, по которым вам следует прекратить работу с DateTime и использовать вместо них Date, Time или DateTime2 - вот хороший пост в блоге об этом.

Чтобы устранить проблему, измените тип данных столбца базы данных с DateTime на DateTime2. Это можно сделать простым оператором alter table dml:

ALTER TABLE YourTable
    ALTER COLUMN col DateTime2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...