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

Nan*_*tte 3 nhibernate asp.net-mvc 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();
Run Code Online (Sandbox Code Playgroud)

类:

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

sp结果

我可以运行这个:

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

但是,当我运行第一个提到的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'附近的语法不正确."}

Rad*_*ler 6

答案隐藏在异常中(主要在这部分中:"@ p1'附近的语法不正确."):

{"无法执行查询\ 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]"}

参数应该用逗号分隔:

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

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

"exec PER_PrikklokSaldi @IDPers=:IDPers, @jaar=:jaar, @maand=:maand"
Run Code Online (Sandbox Code Playgroud)

要改为执行此操作

执行PER_PrikklokSaldi @ p0,@ p1,@ p2