首页 文章

使用NHibernate进行SQLDateTime溢出不一致

提问于
浏览
2

我们有一个非常奇怪的错误,当我们想要从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.FromTimeMan(TimeSpan值)处于System.Data的System.Data.SqlClient.MetaType.FromDateTime(DateTime dateTime,Byte cb)处的System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime值)处 . System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC [] rpcArray,Int32 timeout,Boolean inSchema,SqlNotificationRequest中的SqlClient.TdsParser.WriteValue(Object value,MetaType type,Byte scale,Int32 actualLength,Int32 encodingByteSize,Int32 offset,TdsParserStateObject stateObj) system.Data.SqlClient.SqlCommand.RunExecuteReader的System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async)中的notificationRequest,TdsParserStateObject stateObj,Boolean isCommandProc(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream) ,String方法,DbAsyncResult结果)在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result,String methodName,Boole)一个sendToPipe)位于NHibernate.AdoNet.AnterBatchingBatchingBatcher.AdersTonBatch(IExpectation expectation)的NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd)的NHibernate.Persister.Entity.AbstractEntityPersister.Update的NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd)处的System.Data.SqlClient.SqlCommand.ExecuteNonQuery()对象ID,对象[]字段,对象[] oldFields,对象ROWID,布尔[] includeProperty,的Int32 j,将NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(对象ID对象oldVersion,对象OBJ,SqlCommandInfo SQL,ISessionImplementor会话),对象[]字段,对象[] oldFields,对象ROWID,布尔[] includeProperty,的Int32Ĵ,对象oldVersion,对象OBJ,SqlCommandInfo SQL,ISessionImplementor会话)在NHibernate.Persister.Entity.AbstractEntityPersister.Update(对象ID,对象[]字段,Int32 [] dirtyFields,Boolean hasDirtyCollection,Object [] oldFields,Object oldVersion,Object obj,Object rowId,ISessionImplementor session)NHibernate上的NHibernate.Action.EntityUpdateAction.Execute() . Engine.ActionQueue.Execute在NHibernate.Engine.ActionQueue.ExecuteActions(在NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource Session )在NHibernate.Event(IExecutable可执行文件)在NHibernate.Engine.ActionQueue.ExecuteActions(IList的列表)) . 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.StandardTransaction.Commit()的Castle.Services.Transaction.AbstractTransaction.Commit()处Castle.Facilities.AutomaticTransactionManagement.TransactionInterceptor.Intercept(IInvocation调用)在Castle.DynamicProxy.AbstractInvocation.Proceed()在IReceiveServiceProxy61c28a82c9a24e96957e32292b924889.Save(拍摄在WcfInterfaceService.MobileServices.SaveReceiveLines eive实例)(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,字符串warehouseCode,字符串username,字符串deviceNumber)在d:\项目文档\客户\ ClientX 09.08 \项目\ projectX创建\ ProjectX.WcfInterfaceService \ MobileServices.svc.cs: 7位于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 回答

  • 1

    你在跑步吗?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 .

  • 4

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

    • 您使用什么类型的数据库?

    • 什么样的日期导致例外?

    猜测:您使用的数据库的日期时间范围或精度比您在代码中使用的数据库更小 . 在这种情况下,异常不是由NHibernate引起的,而是由数据库的一个特性引起的 . 这不是一个错误,而是一个功能 .

相关问题