【问题标题】:Can't update a record that has a null date value in Telerik Open Access无法更新 Telerik Open Access 中日期值为空的记录
【发布时间】:2015-07-16 20:53:26
【问题描述】:

我有一个 Telerik 数据访问项目的解决方案。尝试更新记录时遇到问题。我认为问题与在尝试更新它之前它是数据库中具有空值的日期字段这一事实有关,但我不确定。谁能告诉我如何解决它?

在 MVC 项目中,我们有一个名为 tblCoLocation 的模型。它链接到我们的 SQL 数据库。模式在数据访问项目中定义为

namespace Project.OpenAccess
{
public class tblCoLocation
 {
    public int LocID { get; set; }
    ...
    public DateTime ModOn { get; set; }
    public int ModBy { get; set; }
 }
}

要更新数据,在一个名为 Repository.cs 的文件中,我有这个方法:

public void UpdateCoLocation(tblCoLocation obj)
    {
        var upd = dat.tblCoLocations.FirstOrDefault(itm => itm.LocID == obj.LocID);

        if (upd != null)
        {
          upd.ModOn = obj.ModOn;
          upd.ModBy = obj.ModBy;
        }

        dat.SaveChanges();
    }

我有用于更新其他模型的类似代码,但对于 tblCoLocation,它会引发错误。数据库中的字段 ModOn 为空(这是我们客户的设计,null 表示该记录尚未修改,他们希望以这种方式保留数据)。我们正在尝试将 ModOn 设置为今天的日期,并且我已经验证该模型在点击 SaveChanges() 命令时确实具有 ModOn 的值。如果我手动在数据库中的 ModBy 中输入一个值,则更新将按预期工作。这就是为什么我认为 ModOn 最初为 null 可能是问题所在。

进入本节时出现的错误(我已经单步执行了代码,错误来自 dat.SaveChanges)是这样的:

“/”应用程序中的服务器错误。 SqlDateTime 溢出。必须介于 1753 年 1 月 1 日上午 12:00:00 和 9999 年 12 月 31 日晚上 11:59:59。

异常详细信息:System.Data.SqlTypes.SqlTypeException:SqlDateTime 溢出。必须在 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 之间 下午。

[SqlTypeException:SqlDateTime 溢出。必须在 1753 年 1 月 1 日之间 12:00:00 AM 和 12/31/9999 11:59:59 PM。]

Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeUpdate(Nullable 1 命令超时) +785
OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate(Nullable`1 命令超时)+146
OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates(OID oid,Int32 索引,ClassMetaData cmd,PersistGraph 图,Int32[] fieldNos, Boolean haveNewObjects, CharBuf s, BatchControlInfo batchControl, Boolean previousInserts) +3385

[DataStoreException:更新失败: System.Data.SqlTypes.SqlTypeException:SqlDateTime 溢出。一定是 在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。在 Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeUpdate(可空 1 命令超时)在 OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate(Nullable1 命令超时)在 OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates(OID oid,Int32 索引,ClassMetaData cmd,PersistGraph 图,Int32[] fieldNos, Boolean haveNewObjects, CharBuf s, BatchControlInfo batchControl, Boolean previousInserts) 行:GenericOID@91ae60ab tblCoLocation LocID=5 更新 [tblCoLocation] 设置 [Address2] = ?, [国家] = ?, [ModBy] = ?, [ModOn] = ?在哪里 [LocID] = ?和 [地址2] = ?和 [国家] = ?和 [ModBy] = ?和 [ModOn] = ? (放 事件记录到所有人以查看参数值) System.Data.SqlTypes.SqlTypeException:SqlDateTime 溢出。一定是 在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。在

我是否正确地猜测是数据库中 ModOn 的初始空值导致了问题?如果是这样,如何在不改变 ModOn 初始值的情况下保存这条记录?

【问题讨论】:

    标签: c# sql telerik telerik-mvc telerik-open-access


    【解决方案1】:

    这意味着您永远不会设置值ModOn,这意味着它的值是1/1/0001。此值不能存储在 sql 日期时间字段中。您可以确保obj.ModOn 的有效日期大于1/1/1753,或者将sql 列更改为datetime2 类型。

    您也可以在保存之前将值更改为 SqlDateTime.MinValue。但是由于您没有使用 DateTime? 使该列成为可选列,因此您可能在某处遇到了验证问题。

    public void UpdateCoLocation(tblCoLocation obj) {
        var upd = dat.tblCoLocations.FirstOrDefault(itm => itm.LocID == obj.LocID);
    
        if (upd != null) {
            upd.ModOn = obj.ModOn < System.Data.SqlTypes.SqlDateTime.MinValue ? 
                System.Data.SqlTypes.SqlDateTime.MinValue : 
                obj.ModOn;
            upd.ModBy = obj.ModBy;
        }
    
        dat.SaveChanges();
    }
    

    【讨论】:

    • 感谢您的回复。这也是我首先想到的事情之一,我确定我确实设置了 ModOn。正如我在最初的帖子中所说,我单步执行了代码并验证了 obj.ModOn 和 upd.ModOn 在调用 SaveChanges() 时都有一个值。我什至尝试为他们硬编码日期,但产生了同样的错误。
    • @boilers222 尝试在 savechanges() 之前将实体状态设置为已修改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多