不能更新teleerik Open Access中日期值为空的记录

本文关键字:记录 日期 更新 teleerik Open Access 不能 | 更新日期: 2023-09-27 18:03:19

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

在MVC项目中,我们有一个名为tblCoLocation的模型。它链接到我们的SQL数据库。该模式在Data Access项目中定义为
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在数据库中是空的(这是由我们的客户端的设计,空意味着记录没有被修改,他们想要保持数据的方式)。我们试图将ModOn设置为今天的日期,并且我已经验证了模型在击中SaveChanges()命令时确实具有ModOn的值。如果我手动将ModBy中的值放入数据库中,则更新按预期工作。这就是为什么我认为ModOn最初为空可能是问题所在。

到达这一节时发生的错误(我已经遍历了代码,错误来自date . savechanges)是:

'/'应用程序中的服务器错误。SqlDateTime溢出。一定是介于

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

[SqlTypeException: SqlDateTime overflow.]一定是在1753年1月1日之间吧12:00:00 AM和12/31/9999 11:59:59 PM。)

Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp。executeUpdate(可空1commandTimeout) + 785
OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate(可空的1commandTimeout) + 146
OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates (OIDoid, Int32索引,ClassMetaData cmd, PersistGraph图形,Int32[]fieldNos, Boolean haveNewObjects, CharBuf s, BatchControlInfobatchControl, Boolean previousInserts) +3385

[DataStoreException: Update failed:]System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow。必须1753年1月1日上午12:00:00至9999年12月31日晚上11:59:59之间。在Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp。executeUpdate(可空1commandTimeout)OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate (Nullable1commandTimeout)OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates (OIDoid, Int32索引,ClassMetaData cmd, PersistGraph图形,Int32[]fieldNos, Boolean haveNewObjects, CharBuf s, BatchControlInfobatchControl, Boolean previousInserts)行:GenericOID@91ae60abUPDATE [tblCoLocation] SET [Address2] = ?,[Country] = ?, [ModBy] = ?, [ModOn] = ?WHERE [LocID] = ?和[Address2] = ?AND[国家]= ?AND [ModBy] = ?AND[动词]= ?(设置事件记录到所有以查看参数值)System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow。必须1753年1月1日上午12:00:00至9999年12月31日晚上11:59:59之间。在

它看起来像我是正确的猜测,这是在数据库中ModOn的初始空值导致的问题?如果是这样,我如何保存这条记录而不改变ModOn的初始值?

不能更新teleerik Open Access中日期值为空的记录

这意味着您从未设置值ModOn,这意味着它的值是1/1/0001。此值不能存储在SQL datetime字段中。您可以确保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();
}