NHibernate - NHibernate.Exceptions.GenericADOException:无法执行查询

时间:2011-12-22 09:26:19

标签: c# nhibernate

我有以下异常似乎随机发生:

    NHibernate.Exceptions.GenericADOException: could not execute query
    [ select businesspr0_.BusinessProcessID as col_0_0_, businesspr0_.ProcessNumber as col_1_0_, businesspr1_.Name as col_2_0_, businesspr0_.DateCreated as col_3_0_, actor2_.DisplayName as col_4_0_, usergroup3_.Name as col_5_0_, processele5_.Name as col_6_0_ from BusinessProcess businesspr0_ inner join BusinessProcess businesspr1_ on businesspr0_.DefinitionID=businesspr1_.BusinessProcessID inner join Actor actor2_ on businesspr0_.ActorCreatedID=actor2_.ActorID left outer join UserGroup usergroup3_ on businesspr0_.UserGroupCreatedID=usergroup3_.UserGroupID left outer join Actor usergroup3_1_ on usergroup3_.UserGroupID=usergroup3_1_.ActorID inner join ActiveElement activeelem4_ on businesspr0_.BusinessProcessID=activeelem4_.BusinessProcessID inner join ProcessElement processele5_ on activeelem4_.ProcessElementID=processele5_.ProcessElementID inner join ProcessEmployees processemp6_ on businesspr0_.BusinessProcessID=processemp6_.BusinessProcessID inner join Actor actor7_ on processemp6_.ActorID=actor7_.ActorID inner join UserInGroups users8_ on actor7_.ActorID=users8_.UserGroupID inner join AppUser user9_ on users8_.UserID=user9_.UserID inner join Actor user9_1_ on user9_.UserID=user9_1_.ActorID where businesspr0_.IsDefinition=0 and (businesspr0_.Finished is null) and @p0=user9_.UserID ]
      Name:userID - Value:32771
    [SQL: select businesspr0_.BusinessProcessID as col_0_0_, businesspr0_.ProcessNumber as col_1_0_, businesspr1_.Name as col_2_0_, businesspr0_.DateCreated as col_3_0_, actor2_.DisplayName as col_4_0_, usergroup3_.Name as col_5_0_, processele5_.Name as col_6_0_ from BusinessProcess businesspr0_ inner join BusinessProcess businesspr1_ on businesspr0_.DefinitionID=businesspr1_.BusinessProcessID inner join Actor actor2_ on businesspr0_.ActorCreatedID=actor2_.ActorID left outer join UserGroup usergroup3_ on businesspr0_.UserGroupCreatedID=usergroup3_.UserGroupID left outer join Actor usergroup3_1_ on usergroup3_.UserGroupID=usergroup3_1_.ActorID inner join ActiveElement activeelem4_ on businesspr0_.BusinessProcessID=activeelem4_.BusinessProcessID inner join ProcessElement processele5_ on activeelem4_.ProcessElementID=processele5_.ProcessElementID inner join ProcessEmployees processemp6_ on businesspr0_.BusinessProcessID=processemp6_.BusinessProcessID inner join Actor actor7_ on processemp6_.ActorID=actor7_.ActorID inner join UserInGroups users8_ on actor7_.ActorID=users8_.UserGroupID inner join AppUser user9_ on users8_.UserID=user9_.UserID inner join Actor user9_1_ on user9_.UserID=user9_1_.ActorID where businesspr0_.IsDefinition=0 and (businesspr0_.Finished is null) and @p0=user9_.UserID]
 ---> System.IndexOutOfRangeException: col_0_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.Hql.Ast.ANTLR.Loader.QueryLoader.GetResultColumnOrRow(Object[] row, IResultTransformer resultTransformer, 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 DotExe.TiCat.DomainModel.Repository.ProcessModel.BusinessProcessDAO.GetProcessForUserGroups(Int32 userID) in D:\Projects\TiCatRNIDS\DotExe.TiCat4\DotExe.TiCat.DomainModel.Repository\ProcessModel\BusinessProcessDAO.cs:line 98
       at DotExe.TiCat4.UseCaseRepository.TicketProcess.TicketQueues.RefreshQueue() in D:\Projects\TiCatRNIDS\DotExe.TiCat4\DotExe.TiCat4\UseCaseRepository\TicketProcess\TicketQueues.cs:line 128

奇怪的部分是这个System.IndexOutOfRangeException:col_0_0_我无法弄清楚为什么会发生。 如有必要,我可以使用一些xml映射更新帖子。

TNX

更新

映射和查询抛出ex:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DotExe.TiCat.DomainModel" namespace="DotExe.TiCat.DomainModel.Process">

  <class name="BusinessProcess" table="BusinessProcess">
    <id name="BusinessProcessID">
      <generator class="hilo"/>
    </id>
    <property name = "Name" length="1024" type="string" not-null ="false" />
    <property name = "Description" length="5000" type="string" not-null ="false" />
    <property name = "ProcessNumber" length="500" type="string" not-null ="false" />
    <property name = "CommentOnSolve" length="5000" type="string" not-null ="false" />
    <property name="IsDefinition" type="bool"/>
    <property name="PlaningTimeToSpend" type="long"/>
    <property name="SpendTime" type="long"/>
    <property name="DateCreated" type="DateTime" not-null="false"/>
    <property name="PlanToStart" type="DateTime" not-null="false"/>
    <property name="PlanToFinish" type="DateTime" not-null="false"/>
    <property name="Started" type="DateTime" not-null="false"/>
    <property name="Finished" type="DateTime" not-null="false"/>
    <property name="CustomerRequestCallBack" type="bool" not-null="false"/>
    <property name="EscalationTimeLimitInPercents" type="int"/>
    <property name="IsEscalated" type="bool"/>
    <property name="IsInfinite" type="bool"/>
    <many-to-one name="WorkingWeek" class="WorkingWeek" column="WorkingWeekID" not-null="false" lazy="false"/>
    <many-to-one name="Priority" class="ProcessPriority" column="PriorityID" not-null="false" lazy="false"/>
    <many-to-one name="UserCreated" class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorCreatedID" not-null="false" lazy="false"/>
    <many-to-one name="UserSolved" class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorSolvedID" not-null="false" lazy="false"/>
    <many-to-one name="GroupCreated" class="DotExe.TiCat.DomainModel.Actors.UserGroup" column="UserGroupCreatedID" not-null="false" lazy="false"/>
    <many-to-one name="GroupSolved" class="DotExe.TiCat.DomainModel.Actors.UserGroup" column="UserGroupSolvedID" not-null="false" lazy="false"/>
    <many-to-one name="Definition" class="BusinessProcess" column="DefinitionID" cascade="none" />      
    <set name="Elements" lazy="false" cascade="save-update">
      <key column="BusinessProcessID"/>
      <one-to-many class="ProcessElement"/>
    </set>
    <set name="ActiveElements" table="ActiveElement" lazy="false" cascade="save-update">
      <key column="BusinessProcessID"/>
      <many-to-many class="ProcessElement" column="ProcessElementID"/>
    </set>
    <set name="ProcessConsumers" table="ProcessConsumers" lazy="false" cascade="save-update">
      <key column="BusinessProcessID"/>
      <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/>
    </set>
    <set name="ProcessEmployees" table="ProcessEmployees" lazy="false">
      <key column="BusinessProcessID"/>
      <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/>
    </set>
    <set name="ProcessSupervisors" table="ProcessSupervisors" lazy="false">
      <key column="BusinessProcessID"/>
      <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/>
    </set>
    <set name="Flows" lazy="false" cascade="save-update">
      <key column="BusinessProcessID"/>
      <one-to-many class="SequenceFlow"/>
    </set>
    <set name="PriorityTimeRules" lazy="false" cascade="save-update">
      <key column="BusinessProcessID"/>
      <one-to-many class="DotExe.TiCat.DomainModel.BusinessRules.PriorityTimeRule"/>
    </set>
  </class>

  <class name="ProcessElement" table="ProcessElement">
    <id name="ProcessElementID">
      <generator class="hilo"/>
    </id>
    <property name = "Name" length="1024" type="string" not-null ="true" />
    <property name="IsDefinition" type="bool"/>
    <property name="IsState" type="bool"/>

    <many-to-one class="BusinessProcess" name="MemberOf" lazy="false" cascade="save-update" column="BusinessProcessID"/>
    <many-to-one class="ProcessElement" name="Definition" column="DefinitionID"/>

    <joined-subclass name="Activity">
      <key column="ActivityID"/>
      <property name = "Name" length="1024" type="string" not-null ="true" />
      <property name = "Description" length="4000" type="string" not-null ="false" />
      <set name="States" >
        <key column="ActivityID"/>
        <one-to-many class="ActivityState"/>
      </set>

      <joined-subclass name="UserTask" table="UserTask">
        <key column="UserTaskID"/>
        <property name="PlaningTimeToSpend" type="int"/>
        <property name="SpendTime" type="int"/>
        <property name="PlanToStart" type="DateTime" not-null="false"/>
        <property name="PlanToFinish" type="DateTime" not-null="false"/>
        <property name="Started" type="DateTime" not-null="false"/>
        <property name="Finished" type="DateTime" not-null="false"/>
        <set name="Comments">
          <key column="UserTaskID"/>
          <one-to-many class="TaskComment"/>
        </set>
        <set name="UserTaskEmployees">
          <key column="UserTaskID"/>
          <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/>
        </set>
        <set name="UserTaskSupervisors">
          <key column="UserTaskID"/>
          <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/>
        </set>
        <set name="Priorities">
          <key column="UserTaskID"/>
          <one-to-many class="UserTaskPriority"/>
        </set>
        <set name="AssignmentRules">
          <key column="UserTaskID"/>
          <one-to-many class="DotExe.TiCat.DomainModel.BusinessRules.AssignmentRule"/>
        </set>
        <many-to-one class="DotExe.TiCat.DomainModel.UseCase.ClientApplicationConfig" name="Application" column="ApplicationConfigID"/>
        <many-to-one class="UserTaskPriority" name="TaskPriority" column="TaskPriorityID"/>
      </joined-subclass>

      <joined-subclass name="SendTask">
        <key column="SendTaskID"></key>
        <many-to-one name="EmailAccount" class="DotExe.TiCat.DomainModel.Config.EmailAccount" column="EmailAccountID" lazy="false"></many-to-one>
        <many-to-one name="Template" class="DotExe.TiCat.DomainModel.Templates.Template" column="TemplateID" lazy="false"></many-to-one>
        <set name="Actors" lazy="false">
          <key column="SendTaskID"></key>
          <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"></many-to-many>
        </set>
        <set name="EmailMessages">
          <key column="SendTaskID"></key>
          <one-to-many class="DotExe.TiCat.DomainModel.Email.EmailMessage"/>
        </set>
      </joined-subclass>
    </joined-subclass>

    <joined-subclass name="Gateway">
      <key column="GatewayID"/>
      <joined-subclass name="ExclusiveGateway">
        <key column="ExclusiveGatewayID"/>
      </joined-subclass>
    </joined-subclass>

    <joined-subclass name="Event">
      <key column="EventID"></key>
      <property name="ExecutionTime" type="DateTime" not-null="false"></property>

      <joined-subclass name="StartEvent">
        <key column="StartEventID"></key>
      </joined-subclass>

      <joined-subclass name="EndEvent">
        <key column="EntEventID"></key>
      </joined-subclass>
    </joined-subclass>
  </class>
  <class name="ActivityState" table="ActivityState">
    <id name="ActivityStateID">
      <generator class="hilo"/>
    </id>
    <property name = "Name" length="1024" type="string" not-null ="true" />
    <property name = "Description" length="4000" type="string" not-null ="false" />
    <many-to-one name="StateOf" class="Activity" column="ActivityID"/>
    <property name="IsEndState" type="bool"/>
    <property name="IsStartState" type="bool"/>
    <property name="IsPauseState" type="bool"/>
    <property name="IsProcessSerializationState" type="bool"/>
  </class>
  <class name="SequenceFlow" table ="SequenceFlow">
    <id name="SequenceFlowID">
      <generator class="hilo"/>
    </id>
    <many-to-one class="ProcessElement" name="Source" column="SourceID" lazy="false" cascade="save-update"/>
    <many-to-one class="ProcessElement" name="Target" column="TargetID" lazy="false" cascade="save-update"/>
    <many-to-one name="Process" class="BusinessProcess" column="BusinessProcessID" cascade="save-update"/>
  </class>
  <class name="UserTaskPriority" table ="UserTaskPriority">
    <id name="UserTaskPriorityID">
      <generator class="hilo"/>
    </id>
    <property name = "Name" length="1024" type="string" not-null ="true" />
  </class>
  <class name="TaskComment" table ="TaskComment">
    <id name="TaskCommentID">
      <generator class="hilo"/>
    </id>
    <property name = "Comment" length="4000" type="string" not-null ="true" />
    <many-to-one name="Task" class="ProcessElement" column="UserTaskID"/>
    <many-to-one name="Actor" class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/>
    <many-to-one name="Process" class="BusinessProcess" column="BusinessProcessID"/>
    <many-to-one name="Group" class="DotExe.TiCat.DomainModel.Actors.UserGroup" column="UserGroupID"/>
    <property name="CommentTime" type="DateTime" not-null="false" />
  </class>
  <class name="TransitionLog">
    <id name="TransitionLogID">
      <generator class="hilo"/>
    </id>
    <property name="LogDate" type="DateTime"/>
    <property name="TaskStarted" type="DateTime" not-null ="false" />
    <property name="TaskEnded" type="DateTime" not-null ="false" />
    <property name="TimeSpend" type="int" not-null ="false" />
    <set name="SendToActors" table="SendToActorLog" lazy="false">
      <key column="TransitionLogID"/>
      <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/>
    </set>
    <many-to-one name="Actor" class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID" lazy="false"/>
    <many-to-one name="Group" class="DotExe.TiCat.DomainModel.Actors.UserGroup" column="UserGroupID"/>
    <many-to-one name="FromElement" class="ProcessElement" column="FromElementID" lazy="false"/>
    <many-to-one name="ToElement" class="ProcessElement" column="ToElementID"/>
    <many-to-one name="Process" class="BusinessProcess" column="BusinessProcessID"/>
    <many-to-one name="LogType" class="LogType" column="LogTypeID" lazy="false"/>
    <property name="Comment" length="4000" type="string" not-null ="false" />
  </class>
  <class name="LogType">
    <id name="LogTypeID"/>
    <property name = "Name" length="1024" type="string" not-null ="false" />
    <property name = "DisplayName" length="1024" type="string" not-null ="false" />
  </class>

  <class name="ProcessPriority">
    <id name="ProcessPriorityID"/>
    <property name = "Name" length="1024" type="string" not-null ="false" />
    <property name = "DisplayName" length="1024" type="string" not-null ="false" />
  </class>

  <class name="WorkingWeek">
    <id name="WorkingWeekID">
      <generator class="hilo"/>
    </id>
    <property name="MondayFrom" type="DateTime" not-null="true"/>
    <property name="MondayTo" type="DateTime" not-null="true"/>
    <property name="TuesdayFrom" type="DateTime" not-null="true"/>
    <property name="TuesdayTo" type="DateTime" not-null="true"/>
    <property name="WednesdayFrom" type="DateTime" not-null="true"/>
    <property name="WednesdayTo" type="DateTime" not-null="true"/>
    <property name="ThursdayFrom" type="DateTime" not-null="true"/>
    <property name="ThursdayTo" type="DateTime" not-null="true"/>
    <property name="FridayFrom" type="DateTime" not-null="true"/>
    <property name="FridayTo" type="DateTime" not-null="true"/>
    <property name="SaturdayFrom" type="DateTime" not-null="true"/>
    <property name="SaturdayTo" type="DateTime" not-null="true"/>
    <property name="SundayFrom" type="DateTime" not-null="true"/>
    <property name="SundayTo" type="DateTime" not-null="true"/>
    <property name="Is24x7" type="bool"/>
    <property name="Name" type="string" length="256" not-null="true"/>
    <!--<set name="BusinessProcesses" cascade="none" lazy="false">
      <key column="WorkingWeekID"/>
      <one-to-many class="BusinessProcess"/>
    </set>-->

  </class>

</hibernate-mapping>

查询:

IList<object[]> result =
                        session.CreateQuery(" select bp.BusinessProcessID, bp.ProcessNumber, def.Name as Definition," +
                                            " bp.DateCreated, actor.DisplayName as UserCreated," +
                                            " group.Name as GroupCreated, task.Name as ActiveTask " +
                                            " from BusinessProcess bp " +
                                            " join bp.Definition as def " +
                                            " join bp.UserCreated as actor " +
                                            " left join bp.GroupCreated as group " +
                                            " join bp.ActiveElements as task" +
                                            " join bp.ProcessEmployees as res" +
                                            " join res.Users as users " +
                                            " where bp.IsDefinition = false " +
                                            " and bp.Finished is null" +
                                            " and :userID = users.ActorID").SetParameter("userID", userID).List<object[]>();

2 个答案:

答案 0 :(得分:1)

当我尝试将空值映射到不可为空的属性(即整数)时,我遇到了这个错误。确保你确保sql值不可为空,或者只是让c#属性为nullable(public virtual int? NumberOfPoints { get; set; }

答案 1 :(得分:0)

我不知道原因。但是映射中有一些奇怪的东西:Activity有属性&#34; Name&#34;,它已经映射到基类中。这可能导致指数超出范围。周围可能存在更多问题。

要非常小心像#34; Actors&#34;它是多对多的,不指定表名。定义另一个&#34; Actors&#34;的风险很高。设置会产生冲突的表定义。

无关紧要:有些集应该是反向的,因为有一个元素到父元素的引用。