0

我有一个 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 溢出。必须介于 1753 年 1 月 1 日上午 12:00:00 和 9999 年 12 月 31 日晚上 11:59:59 之间。

[SqlTypeException:SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。]

Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeUpdate(Nullable 1 commandTimeout) +785
OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate(Nullable`1 commandTimeout) +146
OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates(OID oid, Int32 index , 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(Nullable 1 commandTimeout) 在 OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate(Nullable1 commandTimeout) 在 OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates(OID oid, Int32 index, ClassMetaData cmd , PersistGraph 图, Int32[] fieldNos, Boolean haveNewObjects, CharBuf s, BatchControlInfo batchControl, Boolean previousInserts) Row: GenericOID@91ae60ab tblCoLocation LocID=5 UPDATE [tblCoLocation] SET [Address2] = ?, [Country] = ?, [ModBy] = ?, [模组] = ? 在哪里 [LocID] = ?和 [地址 2] = ? 和 [国家] = ? 和 [ModBy] = ? 和 [ModOn] = ? (将事件日志设置为所有以查看参数值) System.Data.SqlTypes.SqlTypeException:SqlDateTime 溢出。必须介于 1753 年 1 月 1 日上午 12:00:00 和 9999 年 12 月 31 日晚上 11:59:59 之间。在

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

4

1 回答 1

0

这意味着您永远不会设置值ModOn,这意味着它的值是1/1/0001. 此值不能存储在 sql 日期时间字段中。您可以确保obj.ModOn有效日期大于 1753 年 1 月 1 日,或者将 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();
}
于 2015-07-16T21:19:04.850 回答