SqlDateTime overflow when inserting value with DateTime.Now
最近我在做
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
号
重点是,我只使用
以前没有发生过,现在函数总是中断。我完全没有头绪-我的SQL服务器上的日期似乎还可以。
可能是什么引起的?
编辑
我不认为这会有帮助(在我看来,这太简单了,没有任何错误),但我的功能是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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; } } |
实际上问题是
你需要改变两件事
数据库将字段类型从
DateTime 更改为DateTime2 。您需要明确的查询
1
2
3SqlCommand 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时,我通常会在向DBML添加新的日期字段时获取此信息。
如果这不起作用,请在执行db.submitchanges之前在db.log上设置一个新的StringWriter,然后检查db.log.toString(可以在调试器中执行)。这应该显示查询和所有参数(在底部),这样您就可以看到匹配是什么参数导致了问题。
另一个有助于解决此类问题的方法是使用db.getChangeSet()检查哪些记录以及在SubmitChanges调用之前插入/更新哪些记录(无法想象删除会导致这种情况)。