2009-12-10 9 views
4

J'ai passé la majeure partie de la journée à essayer de résoudre ce problème lors de l'utilisation de NHibernate: "L'index était hors de portée. La taille de la collection Nom du paramètre: index "NHibernate: réception de l'index hors de la plage lors de l'appel de l'opération d'insertion

Ma mise à jour et ma suppression fonctionnent très bien mais l'appel à vider après un appel à save() ne fonctionne pas. Je ne pense pas qu'il sera utile d'afficher tout le code (il y en a beaucoup) parce que je ne suis pas sûr de ce que vous aurez besoin de voir à ce stade. Mon objet d'accès aux données que j'essaie d'enregistrer utilise une clé composite si cela peut vous aider. En outre, j'utilise NHibernate.Mapping.Attributes pour créer mon mapping.

Il semble que dans ma trace de pile, NHibernate tente d'envoyer un nombre de paramètres non valide à la classe ADO.Net pour l'opération d'insertion. Cela étant dit, je trace la valeur true pour afficher des instructions SQL, mais l'erreur est soulevée avant l'instruction SQL envoyé à la sortie donc je ne suis pas sûr de ce qu'il est tentant de construire ..

public void Insert(ProddataDAO Entity) 
{ 
     Entity.PSEQ = GetNewSeqID(Entity.PCUST); // <- because I'm using a composite key, this function gets my a unique value by a group 
     NHibernateHelperCGC.CurrentSession.Save(Entity);    
     NHibernateHelperCGC.CurrentSession.Flush(); // <-This raises the error   
} 

à System.Collections.ArrayList.get_Item (indice Int32) à IBM.Data.DB2.iSeries.iDB2ParameterCollection.System.Collections.IList.get_Item (Int32 indice ) à NHibernate.Type.DecimalType.Set (IDbCommand st , Objet valeur, index Int32) à NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, valeur d'objet, index Int32) à NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, la valeur de l'objet, l'indice Int32, séance ISessionImplementor) à NHibernate.Type.ComponentType.NullSafeSet (IDbCommand st, la valeur de l'objet, Int32 commencer, séance ISessionImplementor) à NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id , Object [] champs, objet rowId, Boolean [] includeProperty, booléennes [] [] includeColumns, table Int32, déclaration IDbCommand, séance ISessionImplementor, l'indice Int32) à NHibernate.Persister.Entity.AbstractEntityPersister.Insert (id objet, Champs Object [], Boolean [] notNull, Int32 j, SqlCommandInfo sql, Objet obj, Session ISessionImplementor) à NHibernate.Persister.Entity.AbstractEntityPersister.Inser t (id objet, Object [] champs, objet obj, séance ISessionImplementor) à NHibernate.Action.EntityInsertAction.Execute() à NHibernate.Engine.ActionQueue.Execute (executable IExecutable) à NHibernate.Engine.ActionQueue.ExecuteActions (liste IList) à NHibernate.Engine.ActionQueue.ExecuteActions() à NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (IEventSource session) à NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (FlushEvent événement ) à NHibernate. Impl.SessionImpl.Flush() à WTS.Data.DB2.CGC.ProddataRepository.Insert (Entité ProddataDAO) dans C: \ Documents and Settings \ briant \ Mes documents \ Visual Studio 2008 \ Projects \ WTSCGCDAL \ WTSCGCDAL \ ProddataRepository.cs: ligne 73 à WTS.WTSCGCAppInterface.ProductionDataUserControlBase.TestInsert() dans C: \ Documents and Settings \ Briant \ Mes documents \ Visual Studio 2008 \ Projects \ WTSCGCAppInterface \ WTSCGCAppInterface \ ProductionDataUserControlBase.cs: ligne 483 à WTSCGCAppInterface.Window1.Button_Click_1 (Object sender, RoutedEventArgs e) dans C: \ Documents and Settings \ Briant \ Mes Documents \ Visual studio 2008 \ Projects \ WTSCGCAppInterface \ WTSCGCAppInterface \ Window1.xaml .cs: ​​ligne 48 à System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object cible, RoutedEventArgs RoutedEventArgs) à System.Windows.EventRoute.InvokeHandlersImpl (source d'objets, RoutedEventArgs args, Boolean relance) à System.Windows.UIElement.RaiseEventImpl (expéditeur DependencyObject, RoutedEventArgs args) à système. Windows.UIElement.RaiseEvent (RoutedEventArgs e) à System.Windows.Controls.Primitives.ButtonBase.OnClick() à System.Windows.Controls.Button.OnClick() à System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp (MouseButtonEventArgs e) à System.Windows.UIElement.OnMouseLeftButtonUpThunk (objet expéditeur, MouseButtonEventArgs e) à System.Windo ws.Input.MouseButtonEventArgs.InvokeEventHandler (délégué GenericHandler, objet genericTarget) à System.Windows.RoutedEventArgs.InvokeHandler (gestionnaire délégué, objet cible) à System.Windows.RoutedEventHandlerInfo.InvokeHandler (cible de l'objet, RoutedEventArgs RoutedEventArgs) à System.Windows.EventRoute.InvokeHandlersImpl (source d'objets, RoutedEventArgs args, Boolean relance) à System.Windows.UIElement.ReRaiseEventAs (expéditeur DependencyObject, RoutedEventArgs args, RoutedEvent NewEvent) à System.Windows.UIElement.CrackMouseButtonEventAndReRaiseEvent (DependencyObject expéditeur, MouseButtonEventArgs e) à Syst em.Windows.UIElement.OnMouseUpThunk (expéditeur d'objet, MouseButtonEventArgs e) à System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (délégué GenericHandler, objet genericTarget) à System.Windows.RoutedEventArgs.InvokeHandler (gestionnaire délégué, objet cible ) à System.Windows.RoutedEventHandlerInfo.InvokeHandler (objectif de l'objet, RoutedEventArgs RoutedEventArgs) à System.Windows.EventRoute.InvokeHandlersImpl (source d'objets, RoutedEventArgs args, Boolean relance) à System.Windows.UIElement.RaiseEventImpl (expéditeur DependencyObject , Arguments RoutedEventArgs) à System.Windows.UIElement.RaiseEvent (RoutedEventArg s args, booléen de confiance) à System.Windows.Input.InputManager.ProcessStagingArea() à System.Windows.Input.InputManager.ProcessInput (InputEventArgs d'entrée ) à System.Windows.Input.InputProviderSite.ReportInput (InputReport inputReport) à System.Windows.Interop.HwndMouseInputProvider.ReportInput (IntPtr hwnd, mode inputMode, timestamp Int32, les actions en RawMouseActions, Int32 x, y Int32, Int32 roue) à System.Windows.Interop.HwndMouseInputProvider.FilterMessage (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Booléen & géré) à System.Windows.Interop.HwndSource.InputFilterMessage (IntPtr hwnd, Int32 msg, IntPtr wParam, lParam IntPtr, Boolean & manipulée) à MS.Win32.HwndWrapper.WndProc (hwnd IntPtr, Int32 msg, IntPtr wParam, lParam IntPtr, Boolean & traitées) à MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) à System.Windows.Threading.ExceptionWrapper.InternalRealCall (délégué rappel, args Object, Boolean isSingleParameter) à System.Windows.Threading.ExceptionWrapper.TryCatchWhen (source d'objets, rappel délégué, objet args, Boolean isSingleParameter , Déléguez catchHandler) à System.Windows.Threading.Dispatcher.WrappedInvoke (de rappel délégué, args Object, Boolean isSingleParameter, délégué catchHandler) à System.Windows.Threading.Dispatcher.InvokeImpl (priorité DispatcherPriority , temporisation TimeSpan, procédé délégué, objet args, booléens isSingleParameter) à System.Windows. Threading.Dispatcher.Invoke (DispatcherPriority priorité , méthode délégué, arg Object) à MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, lParam IntPtr) à MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG & msg) à System.Windows.Threading.Dispatcher.PushFrameImpl (DispatcherFrame frame) at System.Windows.Threading.Dispatcher.PushFrame (structure DispatcherFrame)
à System.Windows.Threading.Dispatcher.Run() à System.Windows.Application.RunDispatcher (Object ignore) à System.Windows.Application.RunInternal (Fenêtre de fenêtre) à System.Windows.Application.Run (fenêtre de fenêtre) à System.Windows.Application.Run() à WTSCGCAppInterface.App.Main() dans C: \ Documents and Settings \ briant \ Mes documents \ Visual Studio 2008 \ Projects \ WTSCGCAppInterface \ WTSCGCAppInterface \ obj \ Debug \ App.g.cs: ligne 0 à System.AppDomain._nExecuteAssembly (Assembly assembly, String [] args) à System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, Stri ng [] args) à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
à System.Threading.ThreadHelper.ThreadStart_Context (état de l'objet)
à System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback rappel, état d'objet) à System.Threading.ThreadHelper.ThreadStart()

Répondre

6

Cette erreur apparaît généralement quand il y a des colonnes manquantes de vos tables. Donc, si une classe a une propriété mappée à la colonne de table qui manque dans la base de données, vous verrez cette erreur.

Vérifiez fondamentalement les discordances entre vos mappages et vos tables de base de données (colonnes manquantes, incompatibilités de type, etc.). Le problème peut être sur une table/entité associée et non sur celle que vous essayez d'enregistrer.

+0

Quelqu'un a répondu dans un autre message que j'avais deux attributs de mappage supplémentaires. Une pour la propriété et une autre pour la clé, je vais vous donner le point d'être proche. –

1

J'ai aussi eu ce problème et après les heures de googler, j'ai découvert qui était un problème dans la mise en correspondance: j'avais une colonne avec le même name deux fois (dans mon cas, il était à la fois un <key-property>, dans le cadre d'un <composite-id> , et aussi une colonne dans l'élément <many-to-one>.J'ai résolu de changer <key-property> à <key-many-to-one> et en supprimant l'élément <many-to-one>).

+1

Au lieu d'afficher la même réponse à plusieurs questions, vous devez marquer les questions en tant que doublons. –

+0

Désolé, je ne le savais pas! – APagano

+0

Je vois que vous ne pouvez pas encore faire cela, parce que vous n'avez pas encore atteint la 50e réputation, mais cela ne devrait pas prendre trop de temps. –