将 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.
正在执行以下代码行:
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.