使用NHibernate进行SQLDateTime溢出不一致

时间:2010-03-05 09:49:27

标签: nhibernate overflow sqldatetime

我们有一个非常奇怪的错误,当我们想要从WCF服务中保存某些内容时,有时会出现此错误。我们保存的对象包含NO无效的日期时间,我们在保存之前都会检查它们。当我们看到此错误时,数据库有时会挂起,并且WCF处于故障状态。当我重新启动数据库和托管WCF的IIS Web应用程序并尝试再次保存时。有用.. 我们很无能,所以如果有人有一些建议,请分享

以下是错误:

2010-03-05 10:21:34,311 [5]错误ProjectX.Business.TTExceptionLogger - ReceiveResultsForMobile()中的某处异常:{0} Castle.Services.Transaction.CommitResourceException:无法提交事务,一个(或多个)资源失败---> System.Data.SqlTypes.SqlTypeException:SqlDateTime溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。    在System.Data.SqlTypes.SqlDateTime.FromTimeSpan(TimeSpan值)    在System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime value)    在System.Data.SqlClient.MetaType.FromDateTime(DateTime dateTime,Byte cb)    at System.Data.SqlClient.TdsParser.WriteValue(Object value,MetaType type,Byte scale,Int32 actualLength,Int32 encodingByteSize,Int32 offset,TdsParserStateObject stateObj)    at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC [] rpcArray,Int32 timeout,Boolean inSchema,SqlNotificationRequest notificationRequest,TdsParserStateObject stateObj,Boolean isCommandProc)    在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async)    在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,DbAsyncResult result)    在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult结果,String methodName,Boolean sendToPipe)    在System.Data.SqlClient.SqlCommand.ExecuteNonQuery()    在NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd)    在NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation期望)    at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,Object [] fields,Object [] oldFields,Object rowId,Boolean [] includeProperty,Int32 j,Object oldVersion,Object obj,SqlCommandInfo sql,ISessionImplementor session)    at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id,Object [] fields,Object [] oldFields,Object rowId,Boolean [] includeProperty,Int32 j,Object oldVersion,Object obj,SqlCommandInfo sql,ISessionImplementor session)    at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,Object [] fields,Int32 [] dirtyFields,Boolean hasDirtyCollection,Object [] oldFields,Object oldVersion,Object obj,Object rowId,ISessionImplementor session)    在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 invocation)    在Castle.DynamicProxy.AbstractInvocation.Proceed()    在IReceiveServiceProxy61c28a82c9a24e96957e32292b924889.Save(接收实例)    at 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,String warehouseCode,String username,String deviceNumber)在D:\ Project Docs \ Clients \ ClientX 09.08 \ Projects \ ProjectX \ ProjectX.WcfInterfaceService \ MobileServices.svc.cs中:第770行    at WcfInterfaceService.MobileServices.ProcessResultsFromMobile(String receiveResult,String warehouseCode,String username,String deviceNumber)在D:\ Project Docs \ Clients \ ClientX 09.08 \ Projects \ ProjectX \ ProjectX.WcfInterfaceService \ MobileServices.svc.cs:line 668

2 个答案:

答案 0 :(得分:4)

您是否正在运行SQL Server 2008?我今天在使用SQL Server 2008时遇到了同样的错误。在数据库中,我将列设置为“date”而不是“datetime”,因为我不关心时间部分。但是.NET中没有“日期”数据类型,因此您使用datetime。

对我来说,我传递的是null datetime值,默认值为1/1/0001 12:00:00 AM。所以我得到了你所看到的相同错误,因为它包含了时间部分。

对我来说,我必须使我的datetime值可以为空,我还必须使用NHibernate中的MsSql2008Dialect,它支持date数据类型。有关NHibernate and SQL Server 2008 here的更多信息。

如果您使用的是SQL Server 2008,我会检查以确保您的数据库数据类型设置正确并且您正在使用MsSql2008Dialect。

答案 1 :(得分:1)

在我给你答案之前我有两个问题:

  1. 您使用什么类型的数据库?
  2. 什么样的日期导致例外?
  3. 猜猜:您使用的数据库日期时间范围或准确度比您在代码中使用的数据库要小。在这种情况下,异常不是由NHibernate引起的,而是由数据库的一个特性引起的。这不是一个错误,而是一个功能。