2 votes

Nhibernate FieldNameLookup jette IndexOutOfRangeException

De temps en temps, nous obtenons cette erreur très bizarre

NHibernate.ADOException: could not execute query
[ SELECT this_.Id as Id37_0_, this_.AREA_ID as AREA2_37_0_, this_.BAT_CHK as BAT3_37_0_, this_.BAT_COD as BAT4_37_0_, this_.BBEACT as BBEACT37_0_, this_.CREDATE as CREDATE37_0_, this_.DEST_LOC as DEST7_37_0_, this_.DOCNR as DOCNR37_0_, this_.DOCTYPE as DOCTYPE37_0_, this_.DUTY_STATUS as DUTY10_37_0_, this_.EAN as EAN37_0_, this_.EXCEPTION_REASON as EXCEPTION12_37_0_, this_.ERROR_TEXT as ERROR13_37_0_, this_.FLOWTYPE as FLOWTYPE37_0_, this_.GOODS_STATUS as GOODS15_37_0_, this_.INSERT_DATETIME as INSERT16_37_0_, this_.MATNR as MATNR37_0_, this_.MVTTYPE as MVTTYPE37_0_, this_.ORDNR as ORDNR37_0_, this_.PACK_ID as PACK20_37_0_, this_.PALNR as PALNR37_0_, this_.PRDACT as PRDACT37_0_, this_.QTYLOAD as QTYLOAD37_0_, this_.SCANNR as SCANNR37_0_, this_.SEQ as SEQ37_0_, this_.SOURCE_LOC as SOURCE26_37_0_, this_.STATUS as STATUS37_0_, this_.TEXT as TEXT37_0_, this_.USER_ID as USER29_37_0_, this_.WH_ID as WH30_37_0_ FROM ZZHTR_RCV this_ WHERE this_.DOCNR = ? and this_.ORDNR = ? and this_.MVTTYPE = ? and this_.WH_ID = ? ]
Positional parameters:  #0>10972365/O #0>1300196311 #0>O #0>NL02
[SQL: <same as above>]
---> System.IndexOutOfRangeException: Id37_0_
at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)
at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
at NHibernate.Driver.NHybridDataReader.GetOrdinal(String name)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
at NHibernate.Loader.Loader.GetKeyFromResultSet(Int32 i, IEntityPersister persister, Object id, IDataReader rs, ISessionImplementor session)
at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
--- End of inner exception stack trace ---
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet1 querySpaces, IType[] resultTypes)
at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session)
at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
at NHibernate.Impl.CriteriaImpl.List(IList results)
at NHibernate.Impl.CriteriaImpl.List[T]()
at Rhino.Commons.RepositoryImplBase1.FindAll(DetachedCriteria criteria, Order[] orders)
at Rhino.Commons.Repository1.FindAll(DetachedCriteria criteria, Order[] orders)

Le problème est que cette erreur n'apparaît pas à chaque fois. Je vois qu'il s'agit de la colonne Id, mais je ne comprends pas pourquoi il y a des problèmes à ce niveau. Je suis presque sûr que le mappage est correct

Cartographie :

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="XX.Business"
                   namespace="XX.Business"
                   default-lazy="true">
  <class name="XX.Business.Receive, XX.Business" table="ZZHTR_RCV" lazy="true">
    <id name="Id" type="int">
      <generator class="identity" />
    </id>
    <property name="AreaCode" column="AREA_ID"/>
    <property name="BatchCheck" column="BAT_CHK"/>
    <property name="BatchCode" column="BAT_COD"/>
    <property name="BbeAct" column="BBEACT"/>
    <property name="CreationDate" column="CREDATE" not-null="true"/>
    <property name="DestinationLocation" column="DEST_LOC"/>
    <property name="DocNr" column="DOCNR"/>
    <property name="DocType" column="DOCTYPE"/>
    <property name="DutyStatus" column="DUTY_STATUS"/>
    <property name="Ean" column="EAN"/>
    <property name="ExceptionReason" column="EXCEPTION_REASON"/>
    <property name="ErrorText" column="ERROR_TEXT"/>
    <property name="FlowType" column="FLOWTYPE"/>
    <property name="GoodsStatus" column="GOODS_STATUS"/>
    <property name="InsertDateTime" column="INSERT_DATETIME" not-null="true"/>
    <property name="MaterialNr" column="MATNR"/>
    <property name="MovementType" column="MVTTYPE"/>
    <property name="OrderNr" column="ORDNR"/>
    <property name="ManufacturingBatch" column="PACK_ID"/>
    <property name="PalletNr" column="PALNR"/>
    <property name="ProdAct" column="PRDACT"/>
    <property name="QuantityLoad" column="QTYLOAD"/>
    <property name="ScanNr" column="SCANNR"/>
    <property name="Sequence" column="SEQ"/>
    <property name="SourceLocation" column="SOURCE_LOC"/>
    <property name="Status" column="STATUS"/>
    <property name="Text" column="TEXT"/>
    <property name="UserId" column="USER_ID"/>
    <property name="WarehouseCode" column="WH_ID"/>

  </class>
</hibernate-mapping>

Classe :

[XmlRoot("ZZHTR_RCV")]
    public class Receive : DomainObject
    {
        [XmlElement("AREA_ID")]
        public virtual string AreaCode { get; set; }
        [XmlElement("BAT_CHK")]
        public virtual string BatchCheck { get; set; }
        [XmlElement("BAT_COD")]
        public virtual string BatchCode { get; set; }
        [XmlElement("BBEACT")]
        public virtual DateTime? BbeAct { get; set; }
        [XmlElement("CREDATE")]
        public virtual DateTime CreationDate { get; set; }
        [XmlElement("DEST_LOC")]
        public virtual string DestinationLocation { get; set; }
        [XmlElement("DOCNR")]
        public virtual string DocNr { get; set; }
        [XmlElement("DOCTYPE")]
        public virtual string DocType { get; set; }
        [XmlElement("DUTY_STATUS")]
        public virtual DutyStatus DutyStatus { get; set; }
        [XmlElement("EAN")]
        public virtual string Ean { get; set; }
        [XmlElement("ERROR_TEXT")]
        public virtual string ErrorText { get; set; }
        [XmlElement("FLOWTYPE")]
        public virtual string FlowType { get; set; }
        [XmlElement("GOODS_STATUS")]
        public virtual GoodsStatus GoodsStatus { get; set; }
        [XmlElement("INSERT_DATETIME")]
        public virtual DateTime InsertDateTime { get; set; }
        [XmlElement("MATNR")]
        public virtual string MaterialNr { get; set; }
        [XmlElement("MVTTYPE")]
        public virtual string MovementType { get; set; }
        [XmlElement("ORDNR")]
        public virtual string OrderNr { get; set; }
        [XmlElement("PACK_ID")]
        public virtual string ManufacturingBatch { get; set; }
        [XmlElement("PALNR")]
        public virtual string PalletNr { get; set; }
        [XmlElement("PRDACT")]
        public virtual DateTime? ProdAct { get; set; }
        [XmlElement("QTYLOAD")]
        public virtual int QuantityLoad { get; set; }
        [XmlElement("SCANNR")]
        public virtual string ScanNr { get; set; }
        [XmlElement("SEQ")]
        public virtual int Sequence { get; set; }
        [XmlElement("SOURCE_LOC")]
        public virtual string SourceLocation { get; set; }
        [XmlElement("STATUS")]
        public virtual MobileProcessingStatus Status { get; set; }
        [XmlElement("TEXT")]
        public virtual string Text { get; set; }
        [XmlElement("USER_ID")]
        public virtual string UserId { get; set; }
        [XmlElement("WH_ID")]
        public virtual string WarehouseCode { get; set; }
        [XmlElement("EXCEPTION_REASON")]
        public virtual ExceptionReason ExceptionReason { get; set; }
        public virtual string Prodline
        {
            get
            {
                if(string.IsNullOrEmpty(this.PalletNr) || !this.PalletNr.Length.Equals(18))
                {
                    return "000";
                }
                else
                {
                    return this.PalletNr.Substring(8, 3);
                }
            }
        }
        public virtual string EERPProcessOrder { get; set; }

    }

Id est hérité de DomainObject :

public abstract class DomainObject:IDomainObject
    {
        [DataMember]
        public virtual int Id { get; set; }

Tableau :

[Id] [int] IDENTITY(1,1) NOT NULL,
    [AREA_ID] [nvarchar](255) NOT NULL,
    [BAT_CHK] [nvarchar](255) NULL,
    [BAT_COD] [nvarchar](255) NULL,
    [BBEACT] [datetime] NULL,
    [CREDATE] [datetime] NOT NULL,
    [DEST_LOC] [nvarchar](255) NULL,
    [DOCNR] [nvarchar](255) NOT NULL,
    [DOCTYPE] [nchar](2) NOT NULL,
    [DUTY_STATUS] [int] NOT NULL,
    [EAN] [nvarchar](255) NOT NULL,
    [ERROR_TEXT] [nvarchar](255) NULL,
    [EXCEPTION_REASON] [int] NULL,
    [FLOWTYPE] [nvarchar](255) NULL,
    [GOODS_STATUS] [int] NOT NULL,
    [INSERT_DATETIME] [datetime] NOT NULL,
    [MATNR] [nvarchar](255) NOT NULL,
    [MVTTYPE] [nchar](1) NOT NULL,
    [ORDNR] [nvarchar](255) NOT NULL,
    [PACK_ID] [nvarchar](255) NULL,
    [PALNR] [nvarchar](255) NOT NULL,
    [PRDACT] [datetime] NULL,
    [QTYLOAD] [int] NOT NULL,
    [SCANNR] [nvarchar](255) NOT NULL,
    [SEQ] [int] NOT NULL,
    [SOURCE_LOC] [nvarchar](255) NULL,
    [STATUS] [int] NOT NULL,
    [TEXT] [nvarchar](255) NULL,
    [USER_ID] [nvarchar](255) NOT NULL,
    [WH_ID] [nvarchar](255) NOT NULL,

Quelqu'un peut-il nous aider ?

7voto

Oliver Points 1863

Nous - et d'autres - avons également rencontré ce problème. Il semble qu'il soit lié à multithreadé l'accès à l'interface non sécurisée SqlConnection . Les éléments suivants très long contient d'autres exemples et plus de détails sur la question : SQLDataReader.GetOrdinal() échoue rarement avec IndexOutOfRange . Il y a bbzippo États :

Il est évident que S un jeu de résultats provenant de l'opération requête précédente exécutée sur le même connexion il y a quelques secondes.

Malheureusement, je n'ai pas trouvé d'explication réelle à la raison pour laquelle cette exception se produit soudainement dans un code qui fonctionne sans problème depuis un certain temps.

Voici quelques-unes des suggestions formulées dans ce fil de discussion :

  1. Désactivez la mise en commun des connexions, de sorte que votre chaîne de connexion ressemble à ce qui suit "Data Source=Sql2005;Initial Catalog=MyDbName;User Id=MyLogin;Password=MyPass;Pooling=false" (ce qui se traduira très probablement par une baisse de performance pour votre application, mais est sûr de fonctionner )
  2. Refondre tout static qui fait référence à votre SqlConnection instance(s) à non-static
  3. Corrigez l'accès multithread possible à votre SqlConnection (ce n'est peut-être pas si simple...)

J'essaie toujours de trouver la source de l'erreur dans notre application mais ce n'est pas si facile car je n'ai pas pu la reproduire en dehors de notre environnement réel. Matt Neerincx [MSFT] suggère dans une de ses réponses dans le poste susmentionné à utiliser des chaînes de connexion différentes et donc différents pools de connexion pour différentes parties de votre application afin d'identifier la source du problème.

J'ai trouvé une autre lecture concernant ce problème sur les forums consacrés à l'hibernation : https://forum.hibernate.org/viewtopic.php?p=2386963 où une personne a également eu des problèmes avec le lazy-loading dans un scénario multithread.

J'espère que cela guidera quelqu'un dans la bonne direction pour trouver une solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X