Возникли проблемы с DateTime (преобразование типа данных datetime2 приводит к выходу за пределы допустимого диапазона)

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

"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated."

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

@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

Думаю, проблема в том, что он пишет «Май», а база данных не знает, как это сохранить?

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

Я пытался:

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

[Column(TypeName = "datetime2")]

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

public DateTime? BirthDate { get; set; }

Пытался разобрать DateTime, надеясь, что он избавится от «Май». Если возможно, я бы хотел, чтобы дата была сохранена в этом формате.

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

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

public DateTime2 BirthDate { get; set; }

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

01-May-18 12:00:00 AM - это именно то, как он отображается вам. Сообщение об ошибке означает, что вы отправляете обратно значение, которое не находится в допустимом диапазоне, и я предполагаю, что ваш DateTime birthDate - это 01/01.0001 (и почему вы не привязываетесь к своей модели)
user3559349 01.05.2018 12:45

Это сообщение об ошибке может быть связано с тем, что для BirthDate установлено значение DateTime по умолчанию 0001-01-01.

Saadi 01.05.2018 12:48

При таком значении, как 05/01/2018, вы не получите эту ошибку. Однако вместо привязки к вашей модели вы передаете параметры. Возможно, у вас там ошибка, вы не предоставили код, который устанавливает эти параметры. Привязать к модели было бы проще всего.

Cetin Basoz 01.05.2018 12:57

Я не совсем понимаю, что вы имеете в виду, говоря «привязать к модели»? Я только начал работать с asp.net mvc менее двух недель назад, так что я только начинаю процесс.

MOR_SNOW 01.05.2018 13:00

Проверьте параметр birthDate в вашем контроллере AddMember во время отладки, какое значение он имеет? Скорее всего, в нем нет того, что, по вашему мнению, должно быть. Кроме того, в вашей модели вы указали, что BirthDate относится к типу DateTime, но тогда у вас есть этот [Column(TypeName = "datetime2")], и эти 2 являются совершенно разными типами данных. Как бы то ни было, вы получаете сообщение об ошибке, потому что значение, которое вы пытаетесь сохранить в базе данных, не находится в допустимом диапазоне для datetime.

CodingYoshi 01.05.2018 13:03

Ваш метод POST должен быть public ActionResult AddMember(xxx model), где xxx - это модель, которую вы используете в представлении.

user3559349 01.05.2018 13:07

У меня больше нет аннотации dateTime2. Это было просто для того, чтобы попробовать решение, предложенное другими. Я не знаю, почему он вообще говорит dateTime2, для начала, у меня был только DateTime. Я указал в своем посте, какое значение имеет BirthDate

MOR_SNOW 01.05.2018 13:07

Тогда расслабьтесь с образцами. Один и тот же метод в примерах для начинающих имеет 2 метода Create. Один без параметров (вызывается при первом вызове с помощью GET). Второй имеет аннотацию HttpPost и параметр вашей модели (скажем, ваш класс модели - User - Create (User user) -), и этот метод вызывается, когда пользователь заполняет значения и POST.

Cetin Basoz 01.05.2018 13:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
271
1

Ответы 1

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

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

Допустимый диапазон DateTime2 - от 0001-01-01 до 9999-12-31
. (С 1 января по 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;

Вы тоже упоминаете DateTime2 :-) А такого нет? Я не могу его использовать или найти для него пространство имен?

MOR_SNOW 01.05.2018 13:02

Это не тип .Net, это тип SQL Server. Я отредактировал свой ответ, добавив ссылки на официальную документацию.

Zohar Peled 01.05.2018 13:06

Спасибо, @Zohlar Peled. Мне интересно. Поскольку я использую первый подход с кодом EF, придется ли мне изменять столбец каждый раз, когда я создаю БД с нуля?

MOR_SNOW 01.05.2018 13:17

@MOR_SNOW, твоей проблемы нет. Datetime будет работать нормально, если вам не нужно хранить даты ранее 1753 года.

Cetin Basoz 01.05.2018 13:19

Другие вопросы по теме