【问题标题】:SqlDateTime overflow when inserting value with DateTime.Now使用 DateTime.Now 插入值时 SqlDateTime 溢出
【发布时间】:2013-04-17 16:09:48
【问题描述】:

最近我在尝试db.SubmitChanges() 时遇到了非常奇怪的错误:

SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。

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

以前没有发生,现在函数总是中断。我完全一无所知 - 我的 SQL 服务器上的日期似乎没问题。

什么原因造成的?

编辑

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

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

【问题讨论】:

  • 可能与 DMY/MDY 相关吗?即 12-04-2013 18:03:13 可以吗?
  • 请记住,db.SubmitChanges() 会应用自您上次调用 SubmitChanges() 或创建上下文以来的所有更改。您可以通过查看db.GetChangeSet() 来确定涉及的所有更改。任何受影响对象上的任何日期/时间列都可能是原因 - 例如,如果任何日期时间以默认值 DateTime.MinValue 出现,则它超出了 SQL Server 的范围。
  • @mellamokb - 它位于一个仅在此数据库表对象上运行的函数中
  • 要检查的东西。检查您的模型和数据库是否正确(如果它们使用日期,那么 Linq 应该使用 Sql 参数生成 TSQL,这意味着服务器的配置方式并不重要)。如果您要插入新记录,请检查没有其他尚未初始化的日期/日期时间列。检查当您进行更改(例如触发器等)时没有执行其他 Sql。
  • 尝试运行 SQL Profiler 以获取对数据库的所有调用。这会告诉您何时出现此异常以及原因。

标签: c# sql linq


【解决方案1】:

其实问题是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
    

您可以找到更多信息here,herehere

【讨论】:

  • 将类型更改为datetime2 有帮助,但我仍然不知道为什么它停止为datetime 工作
  • @PabloLemurr 也许某处有更新导致您的问题
  • DateTime2 支持更广泛的日期(0001-01-01 到 9999-12-31),这表明传递给 sql 的日期实际上超出了 DateTime 的范围,并且可能是 DateTime.MinValue) .
【解决方案2】:

最有可能的情况是您忘记初始化日期字段 - 您确定已全部设置并且没有添加新字段吗?当我向 DBML 添加一个新的日期字段时,我通常会得到这个,因为它试图插入 01/01/0001 00:00:00

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

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

【讨论】:

  • 发送到我的数据库的日期是我在帖子中提供的格式,它不起作用,但是当我从 SMSS 手动插入行时它工作正常。我有这个 onyl DateTime 字段,它开始导致问题。
  • 您可以将其更改为使用 ISO 配置 (YYYY-MM-DD) 吗?我认为日期值更可靠
  • +1,忘记初始化 DateTime 字段是获取SqlDateTime 范围之外的日期的最常见方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多