2010-03-05 40 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

相關問題