关于c#:使用DateTime.Now插入值时SqlDateTime溢出

SqlDateTime overflow when inserting value with DateTime.Now

最近我在做db.SubmitChanges()时犯了一个很奇怪的错误:

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

重点是,我只使用DateTime.Now在我的对象中设置属性,在调用Response.Write(DateTime.Now.ToString());之后,它显示了17-04-2013 18:03:13应该是什么样子。

以前没有发生过,现在函数总是中断。我完全没有头绪-我的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;
    }
}


实际上问题是SQL DateTime=/=C# Datetime

你需要改变两件事

  • 数据库将字段类型从DateTime更改为DateTime2

  • 您需要明确的查询

    1
    2
    3
    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时,我通常会在向DBML添加新的日期字段时获取此信息。

如果这不起作用,请在执行db.submitchanges之前在db.log上设置一个新的StringWriter,然后检查db.log.toString(可以在调试器中执行)。这应该显示查询和所有参数(在底部),这样您就可以看到匹配是什么参数导致了问题。

另一个有助于解决此类问题的方法是使用db.getChangeSet()检查哪些记录以及在SubmitChanges调用之前插入/更新哪些记录(无法想象删除会导致这种情况)。