【问题标题】:Updating DateTime to database is throwing SqlTypeException - SqlDateTime overflow将 DateTime 更新到数据库会引发 SqlTypeException - SqlDateTime 溢出
【发布时间】:2019-08-29 03:54:19
【问题描述】:

执行以下代码行:

conn.Update(CashInItem)

抛出异常:

SqlDateTime 溢出。必须在 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间(Contrib var updated = connection.Execute(sb.ToString(), entityToUpdate, commandTimeout: commandTimeout, transaction: transaction); 中的第 465 行)

我正在测试 Dapper.Contrib。
我在 SQL Server 中有一个表,其中有几个 DateTime 列 - 其中一些允许 NULL 值。
我创建了一个具有属性的对象以匹配表中的列。对于DateTime 列,属性可以为空。

以下是其中一个属性的示例:

public DateTime? ReconciledOn { get; set; }

我首先使用IDbConnection.Query 方法从SQL 表中获取一条记录。这运行正常并且对象映射很好。当我检查可空的DateTime 值时,它显示null

然后,我对字符串参数进行简单的更改并调用以下内容:

static bool Update(CashIn CashInItem)
{
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString))
    {
        return conn.Update(CashInItem); //Error on this line
    }
}

我该如何解决这个问题?

【问题讨论】:

    标签: c# dapper dapper-contrib


    【解决方案1】:

    您正在使用 SQL 数据类型 DateTime 在 SQL Server 中存储值。此数据类型的有效值范围是:

    1753 年 1 月 1 日至 9999 年 12 月 31 日

    要在代码中表示此列,您使用的是 C# 数据类型 DateTime。此数据类型的有效值范围是:

    DateTime 值类型表示日期和时间,其值范围从 0001 年 1 月 1 日 00:00:00(午夜)至 11:59:59 P.M.,公元 9999 年 12 月 31 日(C.E.)在公历中。

    您的 C# 属性可以为空;但这不是问题。

    问题是,在您的代码中的某处,您将属性实例化为 new DateTime(),然后保持其默认值 01-Jan-0001 12:00:00 AM,最终超出 SQL 数据类型的有效范围,因此出现异常。

    您没有提供足够的有问题的代码;所以你必须自己调试这个分配发生的地方。

    【讨论】:

    • 首先 - 感谢您查看我的问题。我怀疑类似的事情。正如我所提到的,我在调用 update 方法之前检查了两个可为空的日期时间字段的值,并且都返回 null (?oCashInItem.ReconciledOn -> null)。所以我想知道是否在 Update 方法的代码中的某个地方它可能会这样做。我将用相关代码回答我自己的问题。
    【解决方案2】:

    清理我的代码后,它工作了。

    起初,我只是测试 Dapper,然后添加了 Dapper.Contrib。我对两者都有参考。我现在相信原因是该对象是使用 Dapper.Query 加载的,然后在 Dapper.Contrib 更新中使用了该对象。清理后我的代码是这样的

    static void Main(string[] args)
    {
      string dump = "";
      using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["AchieveDB"].ConnectionString)){
      conn.Open();
      CashIn oCashIn = conn.Get<CashIn>(59458);
      dump = ObjectDumper.Dump(oCashIn);
      Console.WriteLine(dump);
      Console.WriteLine("Updating");
      Console.WriteLine("=========");
    
      oCashIn.ReconciledOn = DateTime.Now;
      dump = ObjectDumper.Dump(oCashIn);
      Console.WriteLine(dump);
      conn.Update <CashIn>(oCashIn);
    }
    

    参考资料: using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Diagnostics; using Dapper.Contrib; using Dapper.Contrib.Extensions; using ObjectDumping;

    Contrib 发送到数据库的 SQL 语句: 对于获取 exec sp_executesql N'select * from CashIn where CashInId = @id',N'@id int',@id=59458

    为了更新 exec sp_executesql N'update CashIn set [ -- then all Fields = matching param then list of params and values.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多