Преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона - PullRequest
164 голосов
/ 05 января 2011

В моем HomeController есть следующий код:

    public ActionResult Edit(int id)
    {
        var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First();
        return View(ArticleToEdit);
    }

    [ValidateInput(false)]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(Article ArticleToEdit)
    {

        var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();
        if (!ModelState.IsValid)
            return View(originalArticle);

        _db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit);
        _db.SaveChanges();
        return RedirectToAction("Index");

    }

И это представление для метода редактирования:

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="headline">Headline</label>
            <%= Html.TextBox("headline") %>
        </p>
        <p>
            <label for="story">Story <span>( HTML Allowed )</span></label>
            <%= Html.TextArea("story") %>
        </p>
        <p>
            <label for="image">Image URL</label>
            <%= Html.TextBox("image") %>
        </p>
        <p>
            <input type="submit" value="Post" />
        </p>
    </fieldset>

<% } %>

Когда я нажимаю кнопку отправки, я получаю сообщение об ошибке: {"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."} Есть идеи, в чем проблема? Я предполагаю, что метод edit пытается обновить опубликованное значение в БД до отредактированного, но по какой-то причине это не нравится ... Хотя я не понимаю, почему используется дата, так как она не упоминается в метод контроллера для редактирования?

Ответы [ 20 ]

1 голос
/ 16 июля 2017

У меня была та же проблема, к сожалению, у меня есть два свойства DateTime в моей модели, и одно свойство DateTime является нулевым, прежде чем я сделаю SaveChanges.

Поэтому перед сохранением изменений убедитесь, что ваша модель имеет значение DateTime, или сделайте его обнуляемым, чтобы предотвратить ошибку:

public DateTime DateAdded { get; set; }   //This DateTime always has a value before persisting to the database.
public DateTime ReleaseDate { get; set; }  //I forgot that this property doesn't have to have DateTime, so it will trigger an error

Так что это решает мою проблему, необходимо убедиться, что дата вашей модели соответствуетисправить перед сохранением в базе данных:

public DateTime DateAdded { get; set; }
public DateTime? ReleaseDate { get; set; }
1 голос
/ 25 января 2019

Эта проблема обычно возникает, когда вы пытаетесь обновить сущность. Например, у вас есть объект, который содержит поле с именем DateCreated, равное [Обязательно] , и при вставке записи ошибка не возвращается, но когда вы хотите обновить этот конкретный объект, вы получаете

Ошибка преобразования даты / времени вне диапазона.

Теперь вот решение:

В вашем представлении редактирования, т. Е. edit.cshtml для пользователей MVC, все, что вам нужно сделать, это добавить скрытое поле формы для вашего DateCreated чуть ниже скрытого поля для первичного ключа данных редактирования.

Пример:

@Html.HiddenFor(model => model.DateCreated)

При добавлении этого в представление редактирования у вас никогда не будет этой ошибки, уверяю вас.

1 голос
/ 25 мая 2015

Кроме того, если вы не знаете части кода, где произошла ошибка, вы можете профилировать «плохое» выполнение sql, используя sql profiler, интегрированный в mssql.

Плохой параметр datetime покажет что-то вроде этого:

bad param

0 голосов
/ 29 декабря 2018

Получил эту проблему, когда создал мои классы из подхода Database First. Решено в использовании просто Convert.DateTime (dateCausingProblem) На самом деле, всегда пытайтесь преобразовать значения перед передачей, это спасает вас от неожиданных значений.

0 голосов
/ 17 декабря 2018

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

Эта ошибка возникла из-за того, что NOT присвоило какое-либо значение столбцу даты NOT NULL в БД SQL с помощью EF и было устранено путем присвоения того же значения.

Надеюсь, это поможет!

0 голосов
/ 17 апреля 2018

[решено] В Entity Framework Code First (мой случай) просто изменение DateTime на DateTime? решит мою проблему.

/*from*/ public DateTime SubmitDate { get; set; }
/*to  */ public DateTime? SubmitDate { get; set; }
0 голосов
/ 07 марта 2018

Модель должна иметь нулевое время и дату.Предложенный ранее метод получения объекта, который необходимо изменить, следует использовать вместо ApplyPropertyChanges.В моем случае у меня был этот метод для сохранения моего объекта:

public ActionResult Save(QCFeedbackViewModel item)

И затем в сервисе, я извлекаю, используя:

RETURNED = item.RETURNED.HasValue ? Convert.ToDateTime(item.RETURNED) : (DateTime?)null 

Полный код службы, как показано ниже:

 var add = new QC_LOG_FEEDBACK()
            {

                QCLOG_ID = item.QCLOG_ID,
                PRE_QC_FEEDBACK = item.PRE_QC_FEEDBACK,
                RETURNED = item.RETURNED.HasValue ? Convert.ToDateTime(item.RETURNED) : (DateTime?)null,
                PRE_QC_RETURN = item.PRE_QC_RETURN.HasValue ? Convert.ToDateTime(item.PRE_QC_RETURN) : (DateTime?)null,
                FEEDBACK_APPROVED = item.FEEDBACK_APPROVED,
                QC_COMMENTS = item.QC_COMMENTS,
                FEEDBACK = item.FEEDBACK
            };

            _context.QC_LOG_FEEDBACK.Add(add);
            _context.SaveChanges();
0 голосов
/ 12 апреля 2017

Если у вас есть доступ к БД, вы можете изменить тип столбца БД с datetime на datetime2 (7), он все равно будет отправлять объект datetime, и он будет сохранен

0 голосов
/ 29 марта 2019

Вы должны включить нулевое значение для вашей переменной даты:

 public Nullable<DateTime> MyDate{ get; set; }
0 голосов
/ 23 марта 2017

Попробуйте сделать вашу собственность обнуляемой.

    public DateTime? Time{ get; set; }

работал для меня.

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