В моето приложение искам да получа данни от aсъхранява процедурно, когато таблицата не е картографирана в приложението. В тази съхранена процедура добавих псевдоними към имената на колоните, които отговарят на свойствата в моя клас.
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 код, който получавамтази грешка: {"не можа да изпълни queryrn [exec PER_PrikklokSaldi @ p0 @ p1 @ p2] rn Име: IDPers - Стойност: 827 Име: jaar - Стойност: 2014 Име: maand - Стойност: 1rn [SQL: exec PER_PrikklokSaldi @ p0 @ p1 @ p2] "}
InnerException: {"Неправилен синтаксис в близост до" @ p1 "."}
Отговори:
6 за отговор № 1Отговорът е скрит в изключението (и най-вече в тази част: „Неправилен синтаксис в близост до„ @ p1 "."):
{"не можа да изпълни queryrn [exec PER_PrikklokSaldi @ p0 @ p1 @ p2] rn Име: IDPers - Стойност: 827 Име: jaar - Стойност: 2014 Име: maand - Стойност: 1rn [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)
или може би по-скоро това (за sql сървър)
"exec PER_PrikklokSaldi @IDPers=:IDPers, @jaar=:jaar, @maand=:maand"
За да изпълним това вместо това
exec PER_PrikklokSaldi @ p0, @ p1, @ p2
0 за отговор № 2
Това решение работи сега! Получавам списък на 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();