2010-04-07 62 views
2

每然后我们得到这个非常奇怪的错误NHibernate的FieldNameLookup现在抛出IndexOutOfRangeException

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) 

的问题是,这个错误是不是每次都显示出来。我看到它是Id列,但不明白为什么它存在问题。 我敢肯定的映射是OK

映射:

<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> 

类:

[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是从domainObject的继承:

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

表:

[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, 

任何人都可以帮忙吗?

+0

嘿!你有没有设法找到造成这种情况的原因?我也有同样的问题。 – user2173353 2016-05-12 14:47:19

回答

7

我们和其他人也遇到过这个问题。这似乎与多线程访问非线程安全的SqlConnection有关。以下真的很长帖子包含更多的例子和一些更详细的问题:SQLDataReader.GetOrdinal() fails rarely with IndexOutOfRange。有bbzippo状态:

很明显,SqlDataReader的读取 从几秒钟前相同 连接上执行的 前面的查询遗留下来的结果集。

不幸的是,我还没有找到任何真正的解释,为什么这个异常突然出现在一段时间没有问题的代码中。

一些在给定的线程所提出的建议是:

  1. 关闭连接池,让您的连接字符串看起来像如"Data Source=Sql2005;Initial Catalog=MyDbName;User Id=MyLogin;Password=MyPass;Pooling=false"(这很可能意味着性能损失为您的应用程序,但是一定要工作
  2. 重构所有static代码引用您的SqlConnection实例(或多个)non-static
  3. 解决您SqlConnection S可能的多线程访问(这可能不是那么容易......)

我仍然试图找到我们的应用程序错误的来源,但它不是那么容易,因为我一直无法重现它外面我们的生活环境。 Matt Neerincx [MSFT] suggests in one of his answers在上面提到的帖子中给使用不同的连接字符串,因此针对应用程序的不同部分使用不同的连接池来帮助缩小问题的根源。

我发现关于这个问题的另一个读法是在hibernate论坛上:https://forum.hibernate.org/viewtopic.php?p=2386963,其中一个海报在多线程场景中也存在延迟加载问题。

希望这会引导任何人在正确的方向进行修复。

+0

非常感谢你!不幸的是,我不能做更多的这个答案upvotes并将其标记为接受! :) – Genius 2012-01-10 09:44:21

相关问题