存储过程中的Nhibernate错误,过程GetLastUsed没有提供参数和参数

时间:2014-11-14 17:37:37

标签: c# sql-server stored-procedures nhibernate

我收到了错误  "过程GetClientLastUsed没有提供参数和参数。" 使用NHibernate运行存储过程时。

我的存储过程如下:

USE [EnergyBL]
GO
/****** Object:  StoredProcedure [dbo].[GetClientLastUsed]    Script Date: 11/13/2014 10:53:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[GetClientLastUsed] @ClientID as varchar(50)
/*
Object:  GetClientLastUsed
Description: Returns the last time a client was used to create a workorder

Usage: EXEC GetClientLastUsed

Returns:     0  Successful completion

$Workfile: GetClientLastUsed.sql $
$Revision: 1.0 $
$Author: Nathan R. Meunier $
Created: 2014-11-13 $ModTime 2014-11-13 11:00 $
*/
As
SELECT LastUsed.ClientID, LastUsed.LastUsedDate, LastUsed.Lab
FROM    (
            SELECT ClientID, MAX(DateReceived) AS LastUsedDate, 'Billings' AS Lab
            FROM BLSQL.EnergyBL.dbo.Workorders AS blwo
            GROUP BY ClientID
            UNION ALL
            SELECT ClientID, MAX(DateReceived) AS LastUsedDate, 'Casper' AS Lab
            FROM CASQL.EnergyCA.dbo.Workorders AS blwo
            GROUP BY ClientID
            UNION ALL
            SELECT ClientID, MAX(DateReceived) AS LastUsedDate, 'College Station' AS Lab
            FROM SRVCS.EnergyCS.dbo.Workorders AS blwo
            GROUP BY ClientID
            UNION ALL
            SELECT ClientID, MAX(DateReceived) AS LastUsedDate, 'Gillette' AS Lab
            FROM GLSQL.EnergyGL.dbo.Workorders AS blwo
            GROUP BY ClientID
            UNION ALL
            SELECT ClientID, MAX(DateReceived) AS LastUsedDate, 'Helena' AS Lab
            FROM SRVHE.EnergyHE.dbo.Workorders AS blwo
            GROUP BY ClientID
            UNION ALL
            SELECT ClientID, MAX(DateReceived) AS LastUsedDate, 'Rapid City' AS Lab
            FROM SRVRC.EnergyRC.dbo.Workorders AS blwo
            GROUP BY ClientID
        ) AS LastUsed
WHERE ClientID = @ClientID
ORDER BY ClientID, LastUsedDate DESC

我执行存储过程的映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="Mirage.Domain.Old"
               namespace="Mirage.Domain.Old">

<sql-query name="ClientLastUsed">
    exec GetClientLastUsed :ClientID
</sql-query>
</hibernate-mapping>

使用映射的方法:

    //return the date/time when the client was last used to create a workorder
    public ICollection<ClientLastUsed> GetLastUsed(string ClientID)
    {
        var finalResults = new List<ClientLastUsed>();

        using (ISession session = SessionHelper.OpenSession())
        {
            var results = session
                .GetNamedQuery("ClientLastUsed")
                .SetParameter("ClientID", ClientID)
                .SetResultTransformer(new AliasToBeanResultTransformer(typeof(ClientLastUsed)));

            finalResults = results.List() as List<ClientLastUsed>;

        }

        return finalResults;
    }

获取列的类:

public class ClientLastUsed
{
    public virtual string ClientID { get; set; }
    public virtual string Lab { get; set; }
    public virtual DateTime? LastUsedDate { get; set; }
}

运行解决方案时,catch块返回错误&#34;过程GetClientLastUsed没有提供参数和参数。&#34;

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

试试这个:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Mirage.Domain.Old" namespace="Mirage.Domain.Old">
<import class="ClientLastUsed"/>
  <resultset name="GetClientLastUsed">
    <return-scalar column="ClientID" type="String"/>
    <return-scalar column="Lab" type="String"/>
    <return-scalar column="LastUsedDate " type="DateTime"/>
  </resultset>
<sql-query name="GetClientLastUsed">
    exec GetClientLastUsed :ClientID
</sql-query>
</hibernate-mapping>

而且:

session.GetNamedQuery("GetClientLastUsed").SetString("ClientID", ClientID).SetResultTransformer(Transformers.AliasToBean<ClientLastUsed>()).List<ClientLastUsed>(); 

答案 1 :(得分:0)

按建议更改了我的映射

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="Mirage.Domain.Old"
               namespace="Mirage.Domain.Old">
<import class="ClientLastUsed" />
<resultset name="GetClientLastused">
<return-scalar column="ClientID" type="String" />
<return-scalar column="Lab" type="String" />
<return-scalar column="LastUsedDate" type="DateTime"/>
</resultset>

<sql-query name="GetClientLastUsed">
exec GetClientLastUsed :ClientID
</sql-query>
</hibernate-mapping>

并且方法已更改为处理建议的转换

//return the date/time when the client was last used to create a workorder
    public ICollection<ClientLastUsed> GetLastUsed(string ClientID)
    {
        var finalResults = new List<ClientLastUsed>();

        using (ISession session = SessionHelper.OpenSession())
        {
            var results = session
                .GetNamedQuery("GetClientLastUsed")
                .SetParameter("ClientID", ClientID)
                .SetResultTransformer(Transformers.AliasToBean<ClientLastUsed>()).List<ClientLastUsed>();

            finalResults = results as List<ClientLastUsed>;

        }

        return finalResults;
    }

进行这些更改后,生成的查询才能正常工作。

感谢您的帮助!