2010-03-05 5 views
1

Nous avons une erreur très étrange: parfois nous obtenons cette erreur lorsque nous voulons sauvegarder quelque chose de notre service WCF. L'objet que nous sauvegardons ne contient AUCUNE date-heure invalide, nous les vérifions tous avant de sauvegarder. Lorsque nous voyons cette erreur, la base de données se bloque parfois et le WCF est dans un état défectueux. Lorsque je redémarre la base de données DB et l'application Web IIS où le WCF est hébergé et réessayez d'enregistrer. Il fonctionne .. Nous sommes désemparés donc si quelqu'un a des conseils, s'il vous plaît partagerDébordement SQLDateTime incohérent avec NHibernate

Après l'erreur:

2010-03-05 10: 21: 34311 [5] ERREUR ProjectX.Business.TTExceptionLogger - Exception quelque part dans ReceiveResultsForMobile(): {0} Castle.Services.Transaction.CommitResourceException: Impossible de valider la transaction, une (ou plusieurs) des ressources a échoué ---> System.Data.SqlTypes.SqlTypeException: dépassement SqlDateTime. Doit être compris entre 1/1/1753 12:00:00 AM et 31/12/9999 23:59:59. à System.Data.SqlTypes.SqlDateTime.FromTimeSpan (valeur TimeSpan) à System.Data.SqlTypes.SqlDateTime.FromDateTime (valeur DateTime) à System.Data.SqlClient.MetaType.FromDateTime (DateTime dateTime, Byte cb) à System.Data.SqlClient.TdsParser.WriteValue (valeur d'objet, type MetaType, échelle Byte, Int32 actualLength, Int32 encodingByteSize, décalage Int32, TdsParserStateObject stateObj) à 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, async Boolean) à System.Data.SqlClient.SqlCommand.RunExecuteRe ader (CommandBehavior cmdBehavior, runBehavior RunBehavior, Boolean returnStream, méthode String, résultat DbAsyncResult) à System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (résultat de DbAsyncResult, String methodName, Boolean sendToPipe) à System.Data.SqlClient.SqlCommand.ExecuteNonQuery () à NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery (IDbCommand cmd) à NHibernate.AdoNet.NonBatchingBatcher.AddToBatch (attente de IExpectation) à NHibernate.Persister.Entity.AbstractEntityPersister.Update (id Object, Object [] champs, Object [] oldFields, Object rowId, Boolean [] includeProperty, Int32 j, Objet oldVersion, Objet obj, SqlCommandInfo sql, Session ISessionImplementor) à NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert (Object id, Object [] fields, Object [] oldFields, Row de l'objet d, Boolean [] includeProperty, Int32 j, Objet oldVersion, Objet obj, SqlCommandInfo sql, Session ISessionImplementor) à NHibernate.Persister.Entity.AbstractEntityPersister.Update (Object id, Object [] champs, Int32 [] dirtyFields, Boolean hasDirtyCollection, Object [] Oldfields, objet ancienneversion, objet obj, objet rowId, séance ISessionImplementor) à NHibernate.Action.EntityUpdateAction.Execute() à NHibernate.Engine.ActionQueue.Execute (executable IExecutable) à NHibernate.Engine.ActionQueue.ExecuteActions (liste IList) à NHibernate.Engine.ActionQueue.ExecuteActions() à NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (séance IEventSource) à NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (événement FlushEvent) à NHibernate.Impl.SessionImpl.Flush() à NHibernate.Transaction.AdoTransaction.Commit() à Rhino.Commons.NHibernateTransactionAdapter.Commit() à Rhino.Commons.Facilities.RhinoTransactionResourceAdapter.Commit() au château. Services.Transaction.AbstractTransaction.Commit() --- Fin de la trace de pile d'exception interne --- à Castle.Services.Transaction.AbstractTransaction.Commit() à Castle.Services.Transaction.StandardTransaction.Commit() à Castle.Facilities.AutomaticTransactionManagement.TransactionInterceptor.Intercept (invocation de IInvocation) à Castle.DynamicProxy.AbstractInvocation.Proceed() à IReceiveServiceProxy61c28a82c9a24e96957e32292b924889.Save (réception par exemple) à 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 nom d'utilisateur, String deviceNumber) dans D: \ Project Docs \ Clients \ ClientX 09.08 \ Projects \ ProjectX \ ProjectX.WcfInterfaceService \ MobileServices.svc.cs: ligne 770 à WcfInterfaceService.MobileServices.ProcessResultsFromMobile (Chaîne receiveResult, Chaîne warehouseCode, String username, String deviceNumber) dans D: \ Project Docs \ Clients \ ClientX 09.08 \ Projects \ ProjectX \ ProjectX.WcfInterfaceService \ MobileServices.svc.cs: ligne 668

Répondre

4

Exécutez SQL Server 2008? J'ai rencontré cette même erreur aujourd'hui lors de l'utilisation de SQL Server 2008. Sur la base de données j'avais défini la colonne sur "date" au lieu de "datetime" parce que je ne me soucie pas de la partie temps. Mais il n'y a pas de type de données "date" dans .NET donc vous utilisez datetime. Pour moi, je transmettais des valeurs de date/heure nulles qui par défaut ressemblent à 1/1/0001 12:00:00 AM. Donc, je recevais la même erreur que vous voyez parce qu'elle incluait la partie temps. Pour moi, j'ai dû rendre ma valeur datetime nullable et j'ai également dû utiliser le MsSql2008Dialect dans NHibernate qui prend en charge le datatype. Plus d'infos sur NHibernate and SQL Server 2008 here.

Je vérifie pour assurer que le type de votre données de base de données est correctement réglée et que vous utilisez le MsSql2008Dialect si vous utilisez SQL Server 2008.

1

J'ai deux questions avant que je puisse vous donner une réponse:

  1. Quel type de base de données utilisez-vous?
  2. Quelle sorte de date provoque l'exception?

Devinez: vous utilisez une base de données qui a une plage de temps ou une précision plus petite que celle que vous utilisez dans votre code. Dans ce cas, l'exception n'est pas provoquée par NHibernate, mais par une caractéristique de la base de données. Ce n'est pas un bug mais une fonctionnalité.

+0

La base de données est un MSSQL 2005 Les données à l'origine de l'exception sont difficiles à dire. Il apparaît avec deux méthodes, mais lorsque nous inspectons les dates dans l'objet, elles contiennent toutes une date valide. Nous modifions maintenant les types de date à datetime au lieu de smalldatetime. Le problème est que le problème se produit parfois, pas toujours – Sven

+0

Avec quel genre de date, je veux dire quelle est la valeur de la date provoquant l'exception, comme 3/8/2009 – Paco

+0

Nous avons trouvé ce qui n'allait pas Quelque part une propriété (datatime) n'a pas été défini correctement, cela a provoqué le débordement de date/heure – Sven

Questions connexes