/ / Nhibernate CreateSQLQuery Съхранен Процедура резултат към несравнен клас - asp.net-mvc, nhibernate, storage-procedure, hql

Резултат от Nhibernate CreateSQLQuery Stored procedure за несравнен клас - asp.net-mvc, nhibernate, storage-procedure, hql

В моето приложение искам да получа данни от 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:

sp резултат

Мога да изпълня това:

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();