У своїй програмі я хочу отримувати дані ззберігається процедурно, коли таблиця не відображається у програмі. У цій збереженій процедурі я додав псевдоніми до імен стовпців, які відповідають властивостям мого класу.
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 "."):
{"не вдалося виконати запит [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();