与NHibernate不一致的SQLDateTime溢出

我们有一个非常奇怪的错误,当我们想从WCF服务中保存某些东西时,有时会出现这个错误。 我们保存的对象包含无效的日期时间,我们都在保存之前检查它们。 当我们看到这个错误时,数据库有时会挂起,并且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 value)在System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime值)在System.Data.SqlClient.MetaType.FromDateTime(DateTime dateTime,Byte cb)在System.Data。 SqlClient.TdsParser.WriteValue System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC [] rpcArray,Int32超时,布尔inSchema,SqlNotificationRequest(对象值,MetaType类型,字节比例,Int32 actualLength,Int32编码BigSize,Int32偏移量,通知请求,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 result,String methodName,Boole NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd)在NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation期望)在NHibernate.Persister.Entity.AbstractEntityPersister.Update()的System.Data.SqlClient.SqlCommand.ExecuteNonQuery()在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) NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,Object [] Object []字段,Object [] oldFields,Object rowId,Boolean [] includeProperty,Int32 j,Object oldVersion,Object obj,SqlCommandInfo sql,ISessionImplementor会话)在NHibernate的NHibernate.Action.EntityUpdateAction.Execute(),Int32 [] dirtyFields,Boolean hasDirtyCollection,Object [] oldFields,Object oldVersion,Object obj,Object rowId,ISessionImplementor会话)。 在NHibernate.Engine.ActionQueue.ExecuteActions(IList列表)上的NHibernate.Engine.ActionQueue.ExecuteActions()可以在NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource会话)上执行NHibernate.Event中的Engine.ActionQueue.Execute(IExecutable可执行文件)。 NHibernate上的Default.DefaultFlushEventListener.OnFlush(FlushEvent事件)NHibernate.Impl.SessionImpl.Flush()NHibernate.Transaction.AdoTransaction.Commit()()Rhino.Commons.NHibernateTransactionAdapter.Commit()Rhino.Commons.Facilities.RhinoTransactionResourceAdapter.Commit() )at Castle.Services.Transaction.AbstractTransaction.Commit()---内部异常堆栈跟踪结束---在Castle.Services.Transaction.AbstractTransaction.Commit()的Castle.Services.Transaction.StandardTransaction.Commit()at Castle.Facilities.AutomaticTransactionManagement.TransactionInterceptor.Intercept(IInvocation调用)在Castle.DynamicProxy.AbstractInvocation.Proceed()在IReceiveServiceProxy61c28a82c9a24e96957e32292b924889.Save(Rec 1 receiveLines, String warehouseCode, String username, String deviceNumber, Boolean removeOldReceiveLines) in D:Project DocsClientsClientX 09.08ProjectsProjectXProjectX.WcfInterfaceServiceMobileServices.svc.cs:line 567 at WcfInterfaceService.MobileServices.ProcessReceiveResults(List中的WcfInterfaceService.MobileServices.SaveReceiveLines(IEnumerable 1 receiveLines, String warehouseCode, String username, String deviceNumber, Boolean removeOldReceiveLines) in D:Project DocsClientsClientX 09.08ProjectsProjectXProjectX.WcfInterfaceServiceMobileServices.svc.cs:line 567 at WcfInterfaceService.MobileServices.ProcessReceiveResults(List在D: Project Docs Clients ClientX 09.08 Projects ProjectX ProjectX.WcfInterfaceService MobileServices.svc.cs 1 receiveLines, String warehouseCode, String username, String deviceNumber, Boolean removeOldReceiveLines) in D:Project DocsClientsClientX 09.08ProjectsProjectXProjectX.WcfInterfaceServiceMobileServices.svc.cs:line 567 at WcfInterfaceService.MobileServices.ProcessReceiveResults(List 1 receiveLines,String warehouseCode,String username,String deviceNumber)中的cs: D: Project Docs Clients ClientX 09.08 Projects ProjectX ProjectX.WcfInterfaceService MobileServices.svc.cs中的WcfInterfaceService.MobileServices.ProcessResultsFromMobile(String receiveResult,String warehouseCode,String username,String deviceNumber)行770:行668


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

对我而言,我传递的是空日期时间值,默认值为1/1/0001 12:00:00 AM。 所以我得到了你所看到的同样的错误,因为它包含了时间部分。

对我来说,我不得不让我的日期时间值为空,并且我还必须在支持日期数据类型的NHibernate中使用MsSql2008Dialect。 有关NHibernate和SQL Server 2008的更多信息,请点击这里。

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


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

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

    链接地址: http://www.djcxy.com/p/26961.html

    上一篇: Inconsistent SQLDateTime Overflow with NHibernate

    下一篇: NHibernate won't persist DateTime SqlDateTime overflow