使用DateTime.Now插入值时SqlDateTime溢出
最近我尝试做db.SubmitChanges()
时有很奇怪的错误:
SqlDateTime溢出。 必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。
关键是,我只使用DateTime.Now
在我的对象中设置属性,并在调用Response.Write(DateTime.Now.ToString());
它显示了应该是17-04-2013 18:03:13
。
它没有发生在早期,现在function总是打破。 我完全无能为力 – 我的SQL服务器上的日期似乎没问题。
可能导致什么呢?
编辑
我不认为这会有所帮助(IMO的任何错误太简单了),但有我的function:
public bool ReportLogIn(int UserID, string IP, int Succeed ... ) { A_UserLoginHistory Report = new A_UserLoginHistory(); Report.IP = IP; Report.UserID = UserID; Report.Status = Succeed; Report.Date = DateTime.Now; //the only DateTime field ... try { db.A_UserLoginRegistry.InsertOnSubmit(Report); db.SubmitChanges(); return true; } catch (Exception e) { ErrorLog.AddError(e.ToString()); return false; } }
实际上问题是SQL DateTime
= / = C# Datetime
你需要改变两件事
-
数据库将字段类型从
DateTime
更改为DateTime2
-
查询您需要明确
SqlCommand cmd = new SqlCommand("insertsomeDate", conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@newDate", SqlDbType.DateTime2).Value = yourDate; //<- as example
你可以在这里 , 这里和这里找到更多的信息
最有可能的是你忘了初始化一个日期字段 – 你确定你已经设置了所有这些并且没有添加新的字段吗? 我通常在向DBML添加新的日期字段时尝试插入01/01/0001 00:00:00
如果这没有帮助,请在DB.SubmitChanges之前在DB.Log上设置一个New StringWriter,然后检查DB.Log.ToString(可以在调试器中执行)。 这应该显示查询和所有参数(在底部),以便您可以看到匹配导致问题的参数。
另一个有助于解决此类问题的方法是使用DB.GetChangeSet()来检查在SubmitChanges调用之前插入/更新的记录(无法想象删除可能导致此问题)