【问题标题】:NHibernate - Returning an output parameter from a mapped Stored ProcedureNHibernate - 从映射的存储过程返回输出参数
【发布时间】:2011-05-26 12:23:08
【问题描述】:

我有一个通过 NHibernate 映射的存储过程。 Sproc 返回一个结果集和一个输出参数,基本上是总记录的计数,然后是结果集本身。像这样的:

CREATE PROCEDURE [dbo].[mySproc]
(
    @StartRecord            INT = 1,
    @EndRecord              INT = 10,
    @TotalRecords       INT OUTPUT
)
AS
BEGIN
    SET NOCOUNT ON

    // Do a count
    SELECT @TotalRecords = COUNT(DISTINCT x.Id)
    FROM Blah ...snip

    // Perform a query with paging
    SELECT
        x.Id,
        x.Column1
    FROM ...some really complex query that uses paging
END

我正在通过 Sproc 实现分页,因此需要获取记录总数。该查询非常复杂,需要跨多个表进行连接,可能会很慢,因此需要通过直接编写 T-SQL 来小心、微调和优化。

我的问题是我无法获取 Sproc (@TotalRecords) 中的 OUTPUT 参数。我已经像这样映射了这个 Sproc:

<class name="MyLibrary.SomeClass, MyLibrary">

    <id name="Id" type="Int32" />
    <property name="Column1" type="String" length="50" not-null="false" />

</class>

<sql-query name="mySproc">
    <return class="MyLibrary.SomeClass, MyLibrary">
        <return-property name="Id" column="Id"/>
        <return-property name="Column1" column="Column1"/>
    </return>

    EXEC mySproc
        @StartRecord = :startRecord,
        @EndRecord = :endRecord,
        @TotalRecords = 0

</sql-query>

我可以像这样得到结果集:

IList<SomeClass> records = Session.GetNamedQuery("mySproc")
    .SetParameter("startRecord", 1, NHibernateUtil.Int32)
    .SetParameter("endRecord", 20, NHibernateUtil.Int32)
    .List<SomeClass>();

但是如何获取@TotalRecords 输出参数呢?

【问题讨论】:

    标签: nhibernate stored-procedures nhibernate-mapping


    【解决方案1】:

    【讨论】:

    • 天啊,太糟糕了!我想我可以将它分成两个 Sproc,或者只是在代码中的 LINQ/HQL 中进行计数。尽管将计数和查询放在一个 Sproc 中的好处是,如果 WHERE 子句发生更改,您知道要同时更改计数和查询。
    • @matheiu 这些链接之一已经损坏。您可能想要编辑您的答案以包含一些重要信息,否则有人可能会Flag it as not-an-answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多