Nhibernate CreateSQLQuery存储过程结果到非映射类

时间:2014-05-20 09:23:08

标签: asp.net-mvc nhibernate stored-procedures hql

在我的应用程序中,我想从存储过程中获取数据,其中表未在应用程序中映射。在这个存储过程中,我在列名中添加了别名,这些列名响应了我的类中的属性。

HQL:

return Session.CreateSQLQuery("exec PER_PrikklokSaldi :IDPers :jaar :maand")
            .AddScalar("Description", NHibernateUtil.String)
            .AddScalar("StartSaldo", NHibernateUtil.Int32)
            .AddScalar("Plus", NHibernateUtil.Int32)
            .AddScalar("Minus", NHibernateUtil.Int32)
            .AddScalar("EndSaldo", NHibernateUtil.Int32)
            .SetParameter("IDPers", _employeeId)
            .SetParameter("jaar", _year)
            .SetParameter("maand", _month)
            .SetResultTransformer(new AliasToBeanResultTransformer(typeof(ClockInfoSaldi)))
            .List<ClockInfoSaldi>()
            .ToList();

类别:

public class ClockInfoSaldi
{
    public string Description { get; set; }
    public int StartSaldo { get; set; }
    public int Plus { get; set; }
    public int Minus { get; set; }
    public int EndSaldo { get; set; }
}

MS SQL Management Studio中的存储过程结果:

sp result

我可以运行:

var test = Session.CreateSQLQuery("exec PER_PrikklokSaldi :IDPers :jaar :maand")
            .SetParameter("IDPers", _employeeId)
            .SetParameter("jaar", _year)
            .SetParameter("maand", _month)

但是当我运行第一个提到的HQL代码时,我收到此错误:{“无法执行查询\ r \ n [exec PER_PrikklokSaldi @ p0 @ p1 @ p2] \ r \ n名称:IDPers - 值:827名称: jaar - 值:2014名称:maand - 值:1 \ r \ n [SQL:exec PER_PrikklokSaldi @ p0 @ p1 @ p2]“}

InnerException:{“@ p1'附近的语法不正确。”}

2 个答案:

答案 0 :(得分:6)

答案隐藏在例外中(主要是在这部分中:&#34;语法不正确附近&#39; @ p1&#39;。&#34;)

  

{&#34;无法执行查询\ r \ n [exec PER_PrikklokSaldi @ p0 @ p1 @ p2] \ r \ n名称:IDPers - 值:827名称:jaar - 值: 2014年名称:maand - 值:1 \ r \ n [SQL:exec PER_PrikklokSaldi @ p0 @ p1 @ p2]&#34;}

参数应该用逗号分隔:

var test = Session.CreateSQLQuery("exec PER_PrikklokSaldi :IDPers, :jaar, :maand")
        .SetParameter("IDPers", _employeeId)
        .SetParameter("jaar", _year)
        .SetParameter("maand", _month)

或者更确切地说这是(对于sql server)

"exec PER_PrikklokSaldi @IDPers=:IDPers, @jaar=:jaar, @maand=:maand"

执行此操作

  

exec PER_PrikklokSaldi @ p0,@ p1,@ p2

答案 1 :(得分:0)

此解决方案现在可以使用!我从存储过程中获取具有正确值的ClockInfoData对象列表。

return Session.CreateSQLQuery("exec PER_PrikklokData :IDPers, :jaar, :maand")
            .SetParameter("IDPers", _employeeId)
            .SetParameter("jaar", _year)
            .SetParameter("maand", _month)
            .SetResultTransformer(new AliasToBeanResultTransformer(typeof(ClockInfoData)))
            .List<ClockInfoData>()
            .ToList();