将 DateTime 更新到数据库会引发 SqlTypeException - SqlDateTime 溢出

Updating DateTime to database is throwing SqlTypeException - SqlDateTime overflow

正在执行以下代码行:

conn.Update(CashInItem)

抛出异常:

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM (line 465 in Contrib var updated = connection.Execute(sb.ToString(), entityToUpdate, commandTimeout: commandTimeout, transaction: transaction);)

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

这是其中一个属性的示例:

public DateTime? ReconciledOn { get; set; }

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

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

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

我该如何解决这个问题?

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

January 1, 1753, through December 31, 9999

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

The DateTime value type represents dates and times with values ranging from 00:00:00 (midnight), January 1, 0001 Anno Domini (Common Era) through 11:59:59 P.M., December 31, 9999 A.D. (C.E.) in the Gregorian calendar.

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

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

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

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

起初,我只是测试 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;

将SQL语句Contrib发送到数据库: 对于获取 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.