Несовместимое переполнение SQLDateTime с NHibernate - PullRequest
2 голосов
/ 05 марта 2010

У нас есть очень странная ошибка, которая иногда возникает, когда мы хотим сохранить что-то из нашей службы WCF. Сохраняемый нами объект не содержит недопустимых значений datetime, мы все проверяем их перед сохранением. Когда мы видим эту ошибку, база данных иногда зависает, и WCF находится в неисправном состоянии. Когда я перезагружаю БД и веб-приложение IIS, где размещается WCF, и пытаюсь сохранить снова. Оно работает.. Мы невежественны, поэтому, если у кого-то есть какой-либо совет, пожалуйста, поделитесь

Ниже приведена ошибка:

2010-03-05 10: 21: 34,311 [5] ОШИБКА ProjectX.Business.TTExceptionLogger - Исключение где-то в ReceiveResultsForMobile (): {0} Castle.Services.Transaction.CommitResourceException: не удалось зафиксировать транзакцию, один (или несколько) ресурсов не удалось ---> System.Data.SqlTypes.SqlTypeException: переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 31.129999 11:59:59 вечера. в System.Data.SqlTypes.SqlDateTime.FromTimeSpan (значение TimeSpan) в System.Data.SqlTypes.SqlDateTime.FromDateTime (значение DateTime) в System.Data.SqlClient.MetaType.FromDateTime (DateTime dateTime, Byte cb) в System.Data.SqlClient.TdsParser.WriteValue (значение объекта, тип мета-типа, масштаб в байтах, значение типа Int32, длина-шифрование Int32, значение-кодировка Int32, смещение Int32, TdsParserStateObject stateObj) в System.Data.SqlClient.TdsParser.TdsExecuteRPC (_SqlRPC [] rpcArray, тайм-аут Int32, логический inSchema, запрос SqlNotificationRequestRequest, TdsParserStateObject stateObj, логический isCommandProc) в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, логический асинхронный) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод String, результат DbAsyncResult) в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (результат DbAsyncResult, String methodName, логическое sendToPipe) в System.Data.SqlClient.SqlCommand.ExecuteNonQuery () в NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery (IDbCommand cmd) в NHibernate.AdoNet.NonBatchingBatcher.AddToBatch (ожидание IExpectation) в NHibernate.Persister.Entity.AbstractEntityPersister.Update (идентификатор объекта, поля объекта [], объект [] oldFields, объект rowId, логический [] includeProperty, Int32 j, объект oldVersion, объектный объект, SqlCommandInfo sql, сеанс ISessionImplementor) в NHibernate. в NHibernate.Persister.Entity.AbstractEntityPersister.Update (идентификатор объекта, поля объекта [], Int32 [] dirtyFields, логическое значение hasDirtyCollection, объект [] oldFields, объект oldVersion, объектный объект, объектный идентификатор строки, сеанс ISessionImplementor) в NHibernate.Action.EntityUpdateAction.Execute () в NHibernate.Engine.ActionQueue.Execute (исполняемый файл IExecutable) в NHibernate.Engine.ActionQueue.ExecuteActions (список IList) в NHibernate.Engine.ActionQueue.ExecuteActions () в NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (сеанс IEventSource) в NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (событие FlushEvent) в NHibernate.Impl.SessionImpl.Flush () в NHibernate.Transaction.AdoTransaction.Commit () в Rhino.Commons.NHibernateTransactionAdapter.Commit () в Rhino.Commons.Facilities.RhinoTransactionResourceAdapter.Commit () в Castle.Services.Transaction.AbstractTransaction.Commit () --- Конец внутренней трассировки стека исключений --- в Castle.Services.Transaction.AbstractTransaction.Commit () в Castle.Services.Transaction.StandardTransaction.Commit () в Castle.Facilities.AutomaticTransactionManagement.TransactionInterceptor.Intercept (вызов IInvocation) в Castle.DynamicProxy.AbstractInvocation.Proceed ()в IReceiveServiceProxy61c28a82c9a24e96957e32292b924889.Save (получение экземпляра) в WcfInterfaceService.MobileServices.SaveReceiveLines (IEnumerable 1 receiveLines, String warehouseCode, String username, String deviceNumber, Boolean removeOldReceiveLines) in D:\Project Docs\Clients\ClientX 09.08\Projects\ProjectX\ProjectX.WcfInterfaceService\MobileServices.svc.cs:line 567 at WcfInterfaceService.MobileServices.ProcessReceiveResults(List 1 receiveLines, строка StringCode, имя пользователя String, String deviceNumber \ клиент \ Project \ X.X.\ MobileServices.svc.cs: строка 770 в WcfInterfaceService.MobileServices.ProcessResultsFromMobile (String receiveResult, String warehouseCode, String username, String deviceNumber) в D: \ Документы проекта \ Клиенты \ ClientX 09.08 \ Projects \ ProjectX \ ProjectX.Werf.Service.ServiceSer.svc.cs: строка 668

Ответы [ 2 ]

4 голосов
/ 05 марта 2010

Вы используете SQL Server 2008? Я столкнулся с этой же ошибкой сегодня при использовании SQL Server 2008. В базе данных я установил столбец «date» вместо «datetime», потому что меня не волнует часть времени. Но в .NET нет типа данных date, поэтому вы используете datetime.

Для меня я передавал нулевые значения даты и времени, которые по умолчанию равнялись 1/1/0001 12:00:00 AM. Так что я получаю ту же ошибку, которую вы видите, потому что она включает в себя временную часть.

Для меня мне пришлось сделать значение datetime обнуляемым, и мне также пришлось использовать MsSql2008Dialect в NHibernate, который поддерживает тип данных date. Больше информации о NHibernate и SQL Server 2008 здесь .

Я бы проверил, чтобы убедиться, что тип данных вашей базы данных задан правильно и что вы используете MsSql2008Dialect, если вы используете SQL Server 2008.

1 голос
/ 05 марта 2010

У меня есть два вопроса, прежде чем я могу дать вам ответ:

  1. Какую базу данных вы используете?
  2. Какая дата вызывает исключение?

Угадайте: вы используете базу данных, которая имеет меньший диапазон времени и точности, чем вы используете в своем коде. В этом случае исключение вызвано не NHibernate, а функцией базы данных. Это не ошибка, а особенность.

...