2010-03-05 34 views
1

我们有一个非常奇怪的错误,当我们想从WCF服务中保存某些东西时,有时会出现这个错误。我们保存的对象包含无效的日期时间,我们都在保存之前检查它们。当我们看到这个错误时,数据库有时会挂起,并且WCF处于错误状态。当我重新启动数据库和托管WCF的IIS Web应用程序并尝试再次保存时。它的工作原理.. 我们是一无所知,所以如果任何人有一些建议,请分享与NHibernate不一致的SQLDateTime溢出

以下是错误:

2010-03-05 10:21:34311 [5] ERROR 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值) 在System.Data.SqlClient.MetaType.FromDateTime(DateTime的日期时间,字节CB) 在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 ,布尔型inSchema,SqlNotificationRequest notificationRequest,TdsParserStateObject stateObj,布尔isCommandProc) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteRe ader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result,String methodName,Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery( )NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd) at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation expectation) at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,Object [] fields,Object [])对象rowId,布尔型[] includeProperty,Int32 j,对象oldVersion,对象obj,SqlCommandInfo sql,ISessionImplementor会话)NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id,Object [] fields,Object [] oldFields) 对象rowI d,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,对象[] oldFields,对象oldVersion,对象OBJ,在NHibernate.Engine.ActionQueue.ExecuteActions在NHibernate.Engine.ActionQueue.Execute(IExecutable可执行) 在NHibernate.Action.EntityUpdateAction.Execute() 对象ROWID,ISessionImplementor会话) (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() 在城堡。 Services.Transaction.AbstractTransaction.Commit() --- Castle.Services.Transaction.StandardTransaction处的Castle.Services.Transaction.AbstractTransaction.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 ,字符串warehouseCode,字符串用户名,字符串deviceNumber)在D:\ Project Docs \ Clients \ ClientX 09.08 \ Projects \ ProjectX \ ProjectX.WcfInterfaceService \ MobileServices.svc.cs:line 770 at WcfInterfaceService.MobileServices.ProcessResultsFromMobile(String receiveResult,String D:\ Project Docs \ Clients \ ClientX 09.08 \ Projects \ ProjectX \ ProjectX.WcfInterfaceService \ MobileServices.svc.cs:line 668

中的仓库代码,仓库代码,字符串用户名,字符串设备编号)

回答

4

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

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

对我来说,我不得不使我的日期时间值为空,我还必须在NHibernate中使用支持日期数据类型的MsSql2008Dialect。有关NHibernate and SQL Server 2008 here的详细信息。

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

1

我有两个问题之前,我可以给你一个答案:

  1. 你使用什么样的数据库?
  2. 什么样的日期导致异常?

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

+0

数据库是MSSQL 2005 导致异常的数据很难说。它有两种方法,但是当我们检查对象中的日期时,它们都包含有效的日期。我们现在将日期类型更改为datetime而不是smalldatetime。问题在于有时出现问题,并不总是 – Sven 2010-03-08 12:03:47

+0

什么样的日期,我的意思是引起异常的日期的值是什么,比如3/8/2009 – Paco 2010-03-08 19:41:03

+0

我们发现什么地方出错了 某处属性(datatime)没有正确设置,导致日期时间溢出 – Sven 2010-03-13 15:55:54

相关问题