/ / Nhibernate CreateSQLQuery Resultado do procedimento armazenado para a classe não mapeada - asp.net-mvc, nhibernate, procedimentos armazenados, hql

Resultado do Nhibernate CreateSQLQuery Stored Procedure para classe não mapeada - asp.net-mvc, nhibernate, stored-procedures, hql

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:

resultado sp

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 № 1

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