Невозможно обновить запись с нулевым значением даты в Telerik Open Access

У меня есть решение с проектом 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?


person boilers222    schedule 16.07.2015    source источник


Ответы (1)


Это означает, что вы никогда не устанавливаете значение ModOn, что означает, что его значение равно 1/1/0001. это значение не может быть сохранено в поле даты и времени sql. вы можете либо убедиться, что obj.ModOn имеет допустимую дату больше 01.01.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();
}
person JamieD77    schedule 16.07.2015
comment
Спасибо за ответ. Это было одной из первых вещей, о которых я тоже подумал, и я убедился, что установил ModOn. Как я уже говорил в своем первоначальном посте, я просмотрел код и убедился, что и obj.ModOn, и upd.ModOn имеют значение, когда они доходят до вызова SaveChanges(). Я даже пытался жестко закодировать для них даты, и это привело к той же ошибке. - person boilers222; 17.07.2015
comment
@boilers222 Попробуйте изменить состояние объекта до сохранения изменений () - person JamieD77; 18.07.2015