首页新闻招聘找找看知识库
  • 回复:13 浏览:4173 2012-08-14 15:23 来自 千里眼

    我想用分页存储过程进行分页,但是Nhibernate执行的存储过程不知道如何把输出参数弄出来,求指点

    create procedure pro_studentList
    (
      @pagesize int,
      @pageIndex int,
      @totalRecord int output
    )
    as
    begin
      select @totalRecord = COUNT(*) from student
       select t.ID,t.Name,t.sex,t.Birthday from (
       select *,ROW_NUMBER() over(order by id desc) as rowIndex from student
       )  t
       where t.rowIndex between  (@pageIndex-1) * @pagesize+1 and @pageIndex * @pagesize 
    end
    go
    代码里我这么调用的,

            public void TestGetPagedListStudent()
            {
                int pageIndex = 1;
                int pageSize = 1;
                int totalRecord = 0;
    
                ISessionFactory sessionFactory = new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
                using (ISession session = sessionFactory.OpenSession())
                {
                    var list = session.GetNamedQuery("pro_studentList")
                        .SetInt32("pageSize", pageSize)
                        .SetInt32("pageIndex", pageIndex)
                        .SetInt32("totalRecord", totalRecord).List<Student>();
                    foreach (Student stu in list)
                    {
                        Console.WriteLine(stu.Name);
                    }
                  
                }
    
            }

    但是报错,

    ------ Test started: Assembly: UnitTest.dll ------
    NHibernate: exec pro_studentList @p0,@p1,@p2;@p0 = 1 [Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)], @p2 = 0 [Type: Int32 (0)]Test 'M:UnitTest.StudentUnitTest.TestGetPagedListStudent' failed: 值“System.Object[]”不是“Domain.Entity.Student”类型,不能在此泛型集合中使用。参数名: value System.ArgumentException: 值“System.Object[]”不是“Domain.Entity.Student”类型,不能在此泛型集合中使用。参数名: value在 System.ThrowHelper.ThrowWrongValueTypeArgumentException(Object value, Type targetType)在 System.Collections.Generic.List`1.System.Collections.IList.Add(Object item)在 NHibernate.Util.ArrayHelper.AddAll(IList to, IList from)在 NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList results)在 NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters, IList results)在 NHibernate.Impl.SessionImpl.List[T](NativeSQLQuerySpecification spec, QueryParameters queryParameters)在 NHibernate.Impl.SqlQueryImpl.List[T]()StudentUnitTest.cs(46,0): 在 UnitTest.StudentUnitTest.TestGetPagedListStudent()
    0 passed, 1 failed, 0 skipped, took 2.89 seconds (Ad hoc).

     

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
       assembly="Domain"
       namespace="Domain.Entity">
    
      <class name="Domain.Entity.Student" table="student">
       
        <id name="ID" type="Int32" unsaved-value="null" >
          <column name="ID" length="4" sql-type="int" not-null="true" unique="true" />
          <generator class="native" />
        </id>
        <property name="Name" type="String">
          <column name="Name" length="20" sql-type="nvarchar" not-null="false"/>
        </property>
        <property name="Sex" type="bool">
          <column name="Sex" length="1" sql-type="bit" not-null="false"/>
        </property>
        <property name="Birthday" type="DateTime">
          <column name="Birthday" length="50" sql-type="dateTime" not-null="false"/>
        </property>
        
      </class>
      <sql-query name="pro_studentList">
        <return-scalar column="ID" type="int"/>
        <return-scalar column="Name" type="string"/>
        <return-scalar column="sex" type="bool"/>
        <return-scalar column="Birthday" type="DateTime"/>
        exec pro_studentList :pageSize,:pageIndex,:totalRecord
      </sql-query>
    </hibernate-mapping>
     刚摸这个东西,感觉好多麻烦,totalrecord这个输出参数怎么弄出来呢,希望有人指点,谢谢了

  • 千里眼
    2012-08-14 15:31 千里眼
    找到错误原因了,是因为配置文件的配置问题,应该这样配置
    <sql-query name="pro_studentList">
    <return alias="Student" entity-name="Student" class="Domain.Entity.Student"></return>
    <!--<return-scalar column="ID" type="int"/>
    <return-scalar column="Name" type="string"/>
    <return-scalar column="sex" type="bool"/>
    <return-scalar column="Birthday" type="DateTime"/>-->
    exec pro_studentList :pageSize,:pageIndex,:totalRecord
    </sql-query>
    第1楼 回到顶楼
  • 千里眼
    2012-08-14 15:31 千里眼
    但是输出参数怎么获得呢?进一步求助
    第2楼 回到顶楼
  • weblogical
    2013-02-01 11:54 weblogical
    能行吗?我用这种报错啊
    第3楼 回到顶楼
  • Alfa
    2013-03-06 20:55 Alfa
    输出参数。。。可行吗?
    第4楼 回到顶楼
  • saro821
    2013-04-02 10:43 saro821
    我也遇到同样的问题,求大师给点意见。
    第5楼 回到顶楼
  • saro821
    2013-04-02 10:43 saro821
    存储过程的输出参数怎么获得?
    第6楼 回到顶楼
  • 千里眼
    2013-04-04 11:24 千里眼
    @saro821
    这我也没搞定,不着调是不是Nhibernate这 个 不支持存储过程的输出参数
    第7楼 回到顶楼
  • 独孤雄
    2013-04-25 10:53 独孤雄
    我也遇到同样的问题,有米有大虾能帮我解决一下,谢谢,非常感谢!!!!!!!
    第8楼 回到顶楼
  • 千里眼
    2013-04-25 10:55 千里眼
    @独孤雄
    有空研究一下Nhibernate的源代码吧,这玩意儿真不知道是不是不支持这返回的参数
    第9楼 回到顶楼
  • 独孤雄
    2013-04-25 11:05 独孤雄
    看来什么orm都有自己的缺点和优点
    第10楼 回到顶楼
  • 独孤雄
    2013-05-08 15:25 独孤雄
    有没有迂回的办法解决这个问题
    第11楼 回到顶楼
  • chentingjiang
    2014-05-16 14:44 chentingjiang
    你好,请问这个问题你最终是怎么解决的?
    第12楼 回到顶楼
  • 千里眼
    2014-07-01 10:47 千里眼
    应该是Nhibernate不支持输出参数,建议修改其源代码
    第13楼 回到顶楼
登录后才能评论,请先登录注册