En mi aplicación quiero obtener datos de unalmacenado procesado donde la tabla no está asignada en la aplicación. En este procedimiento almacenado agregué alias a los nombres de columna que responden a las propiedades de mi clase.
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();
Clase:
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 del procedimiento almacenado en MS SQL Management Studio:
Puedo ejecutar esto:
var test = Session.CreateSQLQuery("exec PER_PrikklokSaldi :IDPers :jaar :maand")
.SetParameter("IDPers", _employeeId)
.SetParameter("jaar", _year)
.SetParameter("maand", _month)
Pero cuando ejecuto el primer código HQL mencionado, obtengoeste error: {"no se pudo ejecutar queryrn [exec PER_PrikklokSaldi @ p0 @ p1 @ p2] rn Nombre: IDPers - Valor: 827 Nombre: jaar - Valor: 2014 Nombre: maand - Valor: 1rn [SQL: exec PER_PrikklokSaldi @ p0 @ p1 @ p2] "}
InnerException: {"Sintaxis incorrecta cerca de" @ p1 "."}
Respuestas
6 para la respuesta № 1La respuesta está oculta en la excepción. (y principalmente en esta parte: "Sintaxis incorrecta cerca de" @ p1 "."):
{"no se pudo ejecutar queryrn [exec PER_PrikklokSaldi @ p0 @ p1 @ p2] rn Nombre: IDPers - Valor: 827 Nombre: jaar - Valor: 2014 Nombre: maand - Valor: 1rn [SQL: exec PER_PrikklokSaldi @ p0 @ p1 @ p2] "}
Los parámetros deben dividirse por comas:
var test = Session.CreateSQLQuery("exec PER_PrikklokSaldi :IDPers, :jaar, :maand")
.SetParameter("IDPers", _employeeId)
.SetParameter("jaar", _year)
.SetParameter("maand", _month)
o tal vez más bien esto (para el servidor sql)
"exec PER_PrikklokSaldi @IDPers=:IDPers, @jaar=:jaar, @maand=:maand"
Para ejecutar esto en su lugar
ejecutivo PER_PrikklokSaldi @ p0, @ p1, @ p2
0 para la respuesta № 2
¡Esta solución funciona ahora! Obtengo una lista de objetos ClockInfoData con los valores correctos del procedimiento almacenado.
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();