2

执行以下代码行:

conn.Update(CashInItem)

抛出异常:

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

我正在测试 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
    }
}

我该如何解决这个问题?

4

2 回答 2

1

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

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

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

DateTime 值类型表示日期和时间,其值范围从 00:00:00(午夜)、0001 年 1 月 1 日 Anno Domini(普通纪元)到 11:59:59 PM、9999 年 12 月 31 日(公历)日历。

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

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

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

于 2019-08-30T07:12:32.693 回答
0

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

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

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 语句:对于 Get 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.

于 2019-08-31T23:54:58.367 回答