У меня есть решение с проектом Telerik Data Access. Я столкнулся с проблемой при попытке обновить запись. Я думаю, что проблема связана с тем, что это поле даты с нулевым значением в базе данных, прежде чем пытаться его обновить, но я не уверен. Может ли кто-нибудь сказать мне, как обойти это?
В проекте 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 (это предусмотрено дизайном нашего клиента, значение null означает, что запись не была изменена, и они хотят сохранить данные такими). Мы пытаемся установить для ModOn текущую дату, и я убедился, что модель действительно имеет значение для ModOn, когда вызывается команда SaveChanges(). Если я вручную поставлю значение ModBy в базу данных, обновление будет работать как положено. Вот почему я думаю, что изначальное значение ModOn может быть нулевым.
Ошибка, которая возникает, когда он попадает в этот раздел (я прошел через код, и ошибка исходит от dat.SaveChanges), такова:
Ошибка сервера в приложении '/' Переполнение SqlDateTime. Должно быть между 01.01.1753 00:00 и 31.12.9999 23:59:59.
Сведения об исключении: System.Data.SqlTypes.SqlTypeException: переполнение SqlDateTime. Должно быть между 01.01.1753 00:00 и 31.12.9999 23:59:59.
[SqlTypeException: переполнение SqlDateTime. Должно быть между 01.01.1753 00:00:00 и 31.12.9999 23: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 graph, Int32[] fieldNos, логическое значение haveNewObjects, CharBuf s, BatchControlInfo batchControl, логическое значение previousInserts) +3385[DataStoreException: Ошибка обновления: System.Data.SqlTypes.SqlTypeException: переполнение SqlDateTime. Должно быть между 01.01.1753 00:00 и 31.12.9999 23:59:59. at 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 index, ClassMeta index, ClassMeta index, ClassMeta index , граф PersistGraph, Int32[] fieldNos, логическое значение haveNewObjects, CharBuf s, BatchControlInfo batchControl, логическое значение previousInserts) Строка: GenericOID@91ae60ab tblCoLocation LocID=5 UPDATE [tblCoLocation] SET [Address2] = ?, [Country] = ?, [ModBy] = ?, [ModOn] = ? ГДЕ [LocID] = ? И [Адрес2] = ? И [Страна] = ? И [ModBy] = ? И [ModOn] = ? (установите ведение журнала событий на все, чтобы увидеть значения параметров) System.Data.SqlTypes.SqlTypeException: переполнение SqlDateTime. Должно быть между 01.01.1753 00:00 и 31.12.9999 23:59:59. в
Похоже ли, что я прав, предполагая, что начальное нулевое значение ModOn в базе данных вызывает проблему? Если да, то как я могу сохранить эту запись, не меняя начальное значение ModOn?