Em meu aplicativo, desejo obter dados de umstored procedured onde a tabela não está mapeada no aplicativo. Neste procedimento armazenado, adicionei aliases aos nomes das colunas que respondem às propriedades em minha classe.
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();
Classe:
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; }
}
Resultado do procedimento armazenado no MS SQL Management Studio:
Eu posso executar isto:
var test = Session.CreateSQLQuery("exec PER_PrikklokSaldi :IDPers :jaar :maand")
.SetParameter("IDPers", _employeeId)
.SetParameter("jaar", _year)
.SetParameter("maand", _month)
Mas quando executo o primeiro código HQL mencionado, receboeste erro: {"não foi possível executar o queryrn [exec PER_PrikklokSaldi @ p0 @ p1 @ p2] rn Nome: IDPers - Valor: 827 Nome: jaar - Valor: 2014 Nome: maand - Valor: 1rn [SQL: exec PER_PrikklokSaldi @ p0 @ p1 @ p2] "}
InnerException: {"Sintaxe incorreta próxima a" @ p1 "."}
Respostas:
6 para resposta № 1A resposta está escondida na exceção (e principalmente nesta parte: "Sintaxe incorreta próxima a" @ p1 "."):
{"não foi possível executar o queryrn [exec PER_PrikklokSaldi @ p0 @ p1 @ p2] rn Nome: IDPers - Valor: 827 Nome: jaar - Valor: 2014 Nome: maand - Valor: 1rn [SQL: exec PER_PrikklokSaldi @ p0 @ p1 @ p2] "}
Os parâmetros devem ser divididos por vírgula:
var test = Session.CreateSQLQuery("exec PER_PrikklokSaldi :IDPers, :jaar, :maand")
.SetParameter("IDPers", _employeeId)
.SetParameter("jaar", _year)
.SetParameter("maand", _month)
ou talvez melhor isso (para servidor sql)
"exec PER_PrikklokSaldi @IDPers=:IDPers, @jaar=:jaar, @maand=:maand"
Para executar isso ao invés
exec PER_PrikklokSaldi @ p0, @ p1, @ p2
0 para resposta № 2
Esta solução funciona agora! Recebo uma lista de objetos ClockInfoData com os valores corretos do procedimento armazenado.
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();