Я получаю эту ошибку:
"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; }
И еще несколько решений, которые я забыл.
Это сообщение об ошибке может быть связано с тем, что для BirthDate установлено значение DateTime по умолчанию 0001-01-01.
При таком значении, как 05/01/2018, вы не получите эту ошибку. Однако вместо привязки к вашей модели вы передаете параметры. Возможно, у вас там ошибка, вы не предоставили код, который устанавливает эти параметры. Привязать к модели было бы проще всего.
Я не совсем понимаю, что вы имеете в виду, говоря «привязать к модели»? Я только начал работать с asp.net mvc менее двух недель назад, так что я только начинаю процесс.
Проверьте параметр birthDate в вашем контроллере AddMember во время отладки, какое значение он имеет? Скорее всего, в нем нет того, что, по вашему мнению, должно быть. Кроме того, в вашей модели вы указали, что BirthDate относится к типу DateTime, но тогда у вас есть этот [Column(TypeName = "datetime2")], и эти 2 являются совершенно разными типами данных. Как бы то ни было, вы получаете сообщение об ошибке, потому что значение, которое вы пытаетесь сохранить в базе данных, не находится в допустимом диапазоне для datetime.
Ваш метод POST должен быть public ActionResult AddMember(xxx model), где xxx - это модель, которую вы используете в представлении.
У меня больше нет аннотации dateTime2. Это было просто для того, чтобы попробовать решение, предложенное другими. Я не знаю, почему он вообще говорит dateTime2, для начала, у меня был только DateTime. Я указал в своем посте, какое значение имеет BirthDate
Тогда расслабьтесь с образцами. Один и тот же метод в примерах для начинающих имеет 2 метода Create. Один без параметров (вызывается при первом вызове с помощью GET). Второй имеет аннотацию HttpPost и параметр вашей модели (скажем, ваш класс модели - User - Create (User user) -), и этот метод вызывается, когда пользователь заполняет значения и POST.





Из сообщения об ошибке совершенно ясно, что тип данных в реальной таблице базы данных - это не 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 :-) А такого нет? Я не могу его использовать или найти для него пространство имен?
Это не тип .Net, это тип SQL Server. Я отредактировал свой ответ, добавив ссылки на официальную документацию.
Спасибо, @Zohlar Peled. Мне интересно. Поскольку я использую первый подход с кодом EF, придется ли мне изменять столбец каждый раз, когда я создаю БД с нуля?
@MOR_SNOW, твоей проблемы нет. Datetime будет работать нормально, если вам не нужно хранить даты ранее 1753 года.
01-May-18 12:00:00 AM- это именно то, как он отображается вам. Сообщение об ошибке означает, что вы отправляете обратно значение, которое не находится в допустимом диапазоне, и я предполагаю, что вашDateTime birthDate- это01/01.0001(и почему вы не привязываетесь к своей модели)