在我的应用程序中,我想从存储过程中获取数据,其中表未在应用程序中映射。在这个存储过程中,我在列名中添加了别名,这些列名响应了我的类中的属性。
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中的存储过程结果:
我可以运行:
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'附近的语法不正确。”}
答案 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();