我有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溢出。必须在之间 1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM。异常详细信息:System.Data.SqlTypes.SqlTypeException:SqlDateTime 溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59之间 PM。
[SqlTypeException:SqlDateTime溢出。必须在17/1年1月1日之间 上午12:00:00和12/31/9999 11:59:59 PM。]
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索引,ClassMetaData cmd,PersistGraph图,Int32 [] fieldNos,Boolean haveNewObjects,CharBuf s,BatchControlInfo batchControl,Boolean previousInserts)+3385[DataStoreException:更新失败: System.Data.SqlTypes.SqlTypeException:SqlDateTime溢出。一定是 在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。在 Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeUpdate(Nullable 1 commandTimeout)at OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate(Nullable1 commandTimeout)at OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates(OID oid,Int32索引,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] =?,[ModOn] =? WHERE [LocID] =?和 [地址2] =?和[国家] =?和[ModBy] =? AND [ModOn] =? (组 事件记录到所有人以查看参数值) System.Data.SqlTypes.SqlTypeException:SqlDateTime溢出。一定是 在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。在
在猜测数据库中ModOn的初始空值是否导致问题时,我是否正确?如果是这样,如何在不更改ModOn的初始值的情况下保存此记录?
答案 0 :(得分:0)
这意味着您永远不会设置值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();
}