2015-07-16 8 views
0

У меня есть решение с проектом Telerik Data Access. При попытке обновить запись возникла проблема. Я думаю, проблема связана с тем, что это поле даты с нулевым значением в базе данных, прежде чем пытаться его обновить, но я не уверен. Может ли кто-нибудь сказать мне, как обойти это?Не удается обновить запись с нулевым значением даты в Telerik Open 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 означает, что запись не была изменена, и они хотят сохранить данные таким образом). Мы пытаемся установить ModOn на сегодняшнюю дату, и я проверил, что модель имеет значение для ModOn, когда оно попадает в команду SaveChanges(). Если я вручную помещаю значение в ModBy в базу данных, обновление работает так, как ожидалось. Вот почему я думаю, что с ошибкой ModOn изначально может быть проблема.

Ошибка, которая происходит, когда он попадает в этот раздел (я ступил через код, и ошибка происходит от dat.SaveChanges) заключается в следующем:

Ошибка сервера в приложении «/». Переполнение SqlDateTime. Должно быть от 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM.

Сведения об исключении: System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Должно быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM.

[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) +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, Boole previousInserts) +3385

[DataStoreException: Ошибка обновления: System.Data.SqlTypes.SqlTypeException: переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 12/31/9999 11:59:59 PM. на Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeUpdate (Nullable 1 CommandTimeout) при OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate (Nullable1 CommandTimeout) в OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates (OID OID, индекс Int32, ClassMetaData CMD, PersistGraph граф, Int32 [] fieldNos, булевы haveNewObjects, CharBuf сек, BatchControlInfo batchControl, булевы previousInserts) Ряд: GenericOID @ 91ae60ab tblCoLocation LocID = 5 ОБНОВЛЕНИЕ [tblCoLocation] SET [ Address2] =?, [Страна] =?, [ModBy] =?, [ModOn] =? WHERE [LocID] =? И [Адрес2] =? И [Страна] =? И [ModBy] =? И [ModOn] =? (установить регистрацию событий для всех, чтобы увидеть значения параметров) System.Data.SqlTypes.SqlTypeException: переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 12/31/9999 11:59:59 PM. на

Похоже, что я прав, угадывая, что это начальное значение null ModOn в базе данных вызывает проблему? Если да, то как сохранить эту запись, не изменяя начальное значение ModOn?

ответ

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(); 
} 
+0

Спасибо за ваш ответ. Это была одна из первых вещей, о которых я думал, и я убедился, что я установил ModOn. Как я уже сказал в своем первоначальном сообщении, я прошел через код и проверил оба obj.ModOn и upd.ModOn имеют значение, когда он переходит к вызову SaveChanges(). Я даже пробовал даты жесткого кодирования для них, и это привело к той же ошибке. – boilers222

+0

@ boilers222 Попробуйте настроить состояние объекта для изменения до сохранения() – JamieD77

 Смежные вопросы

  • Нет связанных вопросов^_^