C# 使用DateTime插入值时SqlDateTime溢出。现在

C# 使用DateTime插入值时SqlDateTime溢出。现在,c#,sql,linq,C#,Sql,Linq,最近,我在尝试执行db.SubmitChanges()时出现了一个非常奇怪的错误: SqlDateTime溢出。必须在1753年1月1日12:00:00 AM和9999年12月31日11:59:59 PM之间 关键是,我只使用DateTime.Now在调用Response.Write(DateTime.Now.ToString())之后设置对象中的属性按原样显示17-04-2013 18:03:13 以前没有发生过这种情况,现在函数总是中断。我完全不知道我的SQL server上的日期似乎还可以

最近,我在尝试执行
db.SubmitChanges()
时出现了一个非常奇怪的错误:

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

关键是,我只使用
DateTime.Now
在调用
Response.Write(DateTime.Now.ToString())之后设置对象中的属性按原样显示
17-04-2013 18:03:13

以前没有发生过这种情况,现在函数总是中断。我完全不知道我的SQL server上的日期似乎还可以

是什么原因造成的

编辑

我不认为这会有帮助(在我看来,出现任何错误都太简单了),但我的功能是:

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;
    }
}

最有可能的情况是,您忘记了初始化日期字段-您确定您已经设置了所有字段,并且没有添加新字段吗?当DBML尝试插入01/01/0001 00:00:00时,我通常会在向DBML添加新的日期字段时得到这个结果

如果这没有帮助,请在执行DB.SubmitChanges之前在DB.Log上设置一个新的StringWriter,然后检查DB.Log.ToString(可以在调试器中执行)。这将向您显示查询和所有参数(在底部),以便您可以查看导致问题的参数


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

实际上问题是
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
    
    SqlCommand cmd=newsqlcommand(“insertsomeDate”,conn);
    cmd.CommandType=CommandType.storedProcess;
    
    cmd.Parameters.Add(“@newDate”,SqlDbType.DateTime2).Value=yourDate//是否与DMY/MDY相关?i、 e.是否可以?请记住
    db.SubmitChanges()
    应用自上次调用
    SubmitChanges()
    或创建上下文以来的所有更改。通过查看
    db.GetChangeSet()
    ,您可以确定涉及到哪些更改。任何受影响对象上的任何日期/时间列都可能是原因-例如,如果任何datetime的默认值为
    datetime.MinValue
    ,则它超出SQL Server的范围。@mellamokb-它位于仅对该数据库表object进行操作的函数内,需要检查的内容。检查您的模型和数据库是否正确(如果它们使用的是日期,那么Linq应该使用Sql参数生成TSQL,这意味着不管服务器如何配置)。如果要插入新记录,请检查没有其他未初始化的日期/日期时间列。检查在进行更改(如触发器等)时是否没有执行其他Sql。尝试运行Sql探查器以获取对数据库的所有调用。这将向您显示出现此异常的时间和原因。发送到my DB的日期是我在帖子中提供的格式,它不起作用,但当我从SMSS手动插入行时,它可以正常工作。我有一个onyl DateTime字段,它开始引起问题。你能把它改成使用ISO配置(YYYY-MM-DD)吗?我认为对于日期值+1更可靠,忘记初始化日期时间字段是获取
    SqlDateTime
    范围之外日期的最常见方法。将类型更改为
    datetime2
    有帮助,但是我仍然不知道为什么它停止了对
    datetime
    @PabloLemurr的工作,可能是因为某个地方的更新导致了您的问题DateTime2支持更大范围的日期(0001-01-01到9999-12-31),这表明传递给sql的日期实际上超出了datetime的范围,可能是datetime.MinValue)。