SqlDateTime溢出。必须在web api的1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间

时间:2013-03-25 11:48:55

标签: asp.net sql-server-2008 asp.net-mvc-4 asp.net-web-api

  

我正在尝试使用asp.net上的c#在web api中构建post方法   mvc 4.每当我使用fiddler向这个api发布值时,我得到了   以下错误:

     

SqlDateTime溢出。必须在1/1/1753 12:00:00 AM之间   12/31/9999 11:59:59 PM

     

我在我的Web API控制器中编写了以下代码。我也有   创建了数据访问层以访问数据库中的数据

public HttpResponseMessage PostMsg(MsgModel item)
    {
        if (ModelState.IsValid && item!=null)
        {
            using (dc = new MsgDataContext())
            {
                var dbMsg = new Msg() 
                {
                 Msg_Title= item.Msg_Title,
                 Msg_Date = item.Msg_Date,                    
                };                  
                dc.Msgs.InsertOnSubmit(dbMsg);
                dc.SubmitChanges();// Getting the above error at this line of code

                var response = Request.CreateResponse<MsgModel>(HttpStatusCode.Created, item);
                string uri = Url.Link("DefaultApi", new { id = dbMsg.Msg_Id});
                response.Headers.Location = new Uri(uri);
                return response;
            }
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }

    }

I am posting the following request body from fiddler by executing the
url http://localhost:65070/api/signup Request Body {
'Msg_Title':"our first msg", 'Msg_Date':"2012/02/23T00:00:00"}

4 个答案:

答案 0 :(得分:0)

错误本身告诉解决方案 -

您正在指定不在这两个日期之间的DateTime值。只需在插入数据库之前检查日期。如果日期小于1/1/1753,则传递DateTime.MinValue,如果日期大于12/31/9999,则传递DateTime.MaxValue

答案 1 :(得分:0)

您传递的日期值'Msg_Date':"2012/02/23T00:00:00"参数未正确解析(作为“已知”日期字符串) - 它没有时区/不匹配任何“已知”{{3 }}

请参阅date format

答案 2 :(得分:0)

您的问题是您正在将字符串解析为DateTime对象。如果Msg_Date是DateTime对象,C sharp将尝试隐式转换。如果失败,则返回null。但是不允许数据库中DateTime对象的空值,因此会出现此异常。在将实体保存到数据库之前进行一些调试。找到合适的日期格式,因为这似乎是您的问题。 查看this帖子,或阅读一些documentation

答案 3 :(得分:-1)

使用SqlTypes.SqlDateTime.MinValue代替DateTime.MinValue为我解决了这个问题。如果您已在代码中使用SqlTypes.SqlDateTime.MinValue.Value个对象,则可以使用DateTime