将datetime2数据类型转换为datetime数据类型导致一个超出范围的值。

196

我在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");
}

这是Edit方法的视图:

<% 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>

<% } %>

当我点击提交按钮时,出现错误:{"将datetime2数据类型转换为datetime数据类型导致值超出范围。\r\n语句已终止。"} 有什么想法吗? 我假设编辑方法正在尝试将数据库中的发布值更新为编辑值,但由于某种原因它不喜欢它...虽然我不明白为什么日期涉及其中,因为在编辑控制器方法中没有提到。


1
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2"); - Anthony Nichols
24个回答

3

我遇到了同样的问题,不幸的是,在执行SaveChanges之前,我的模型上有两个DateTime属性,其中一个DateTime属性为空。

因此,请确保在保存更改之前,您的模型具有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; }

2
如果您使用的是Entity Framework版本>=5,则在类的DateTime属性上应用[DatabaseGenerated(DatabaseGeneratedOption.Computed)]注释将允许数据库表触发器执行其输入记录创建和记录更新日期的工作,而不会导致您的Entity Framework代码出现错误。请注意保留HTML标签。
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateCreated { get; set; }

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateUpdated { get; set; }

这与第六个答案相似,由Dongolo Jeno编写,经Gille Q编辑。

2

你需要为你的日期变量启用null值:

 public Nullable<DateTime> MyDate{ get; set; }

2
此外,如果您不知道错误发生的代码部分,则可以使用集成到 MSSQL 的 SQL Profiler 分析“坏”SQL执行。错误的日期时间参数将显示如下所示: bad param

1
这个问题通常发生在你试图更新一个实体时。例如,你有一个包含一个名为DateCreated的字段的实体,该字段是[Required]的。当你插入记录时,不会返回任何错误,但当你想要更新特定的实体时,你会得到

datetime2 conversion out of range error.

现在,这里是解决方案:

在你的编辑视图中,即edit.cshtml,对于MVC用户,你只需要在编辑数据的主键下面添加一个隐藏的表单字段,用于你的DateCreated

示例:

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

将此添加到编辑视图中,我向您保证您永远不会遇到该错误。

0

模型应该具有可空的日期时间。应该使用早期建议的检索要修改的对象的方法,而不是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

错误: 将datetime2数据类型转换为datetime数据类型时,导致值超出范围。

这个错误是由于在使用EF时,没有为SQL DB中的NOT NULL日期列分配任何值而导致的,并通过分配相同的值来解决。

希望这可以帮助到您!


0
如果您可以访问数据库,您可以将数据库列类型从datetime更改为datetime2(7),它仍将发送datetime对象并保存。

0

将 "CreateDate": "0001-01-01 00:00:00" 更改为 "CreateDate": "2020-12-19 00:00:00"

CreateDate 类型为 public DateTime CreateDate

错误的 JSON:

{ "keyValue": 1, "entity": { "TodoId": 1, "SysId": "3730e2b8-8d65-457a-bd50-041ce9705dc6", "AllowApproval": false, "ApprovalUrl": null, "ApprovalContent": null, "IsRead": true, "ExpireTime": "2020-12-19 00:00:00", "CreateDate": "0001-01-01 00:00:00", "CreateBy": null, "ModifyDate": "2020-12-18 9:42:10", "ModifyBy": null, "UserId": "f5250229-c6d1-4210-aed9-1c0287ab1ce3", "MessageUrl": "https://bing.com" } }

正确的 JSON:

{ "keyValue": 1, "entity": { "TodoId": 1, "SysId": "3730e2b8-8d65-457a-bd50-041ce9705dc6", "AllowApproval": false, "ApprovalUrl": null, "ApprovalContent": null, "IsRead": true, "ExpireTime": "2020年12月19日 00:00:00", "CreateDate": "2020年12月19日 00:00:00", "CreateBy": null, "ModifyDate": "2020年12月18日 9:42:10", "ModifyBy": null, "UserId": "f5250229-c6d1-4210-aed9-1c0287ab1ce3", "MessageUrl": "https://bing.com" } }


0

在使用数据库优先方法创建类时遇到了这个问题。通过简单地使用Convert.DateTime(dateCausingProblem)解决了问题。 实际上,在传递值之前始终尝试转换值,这可以避免出现意外的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接