OUT or INOUT argument ? for routine procedure_name is not a variable or NEW pseudo-variable in BEFORE trigger

Nhibernate Procedure OutPut Mysql

 

Olá, meu nome é Pedro Henrique Priuli, sou desenvolvedor .NET SR - MCP e vou falar sobre uma solução que me tirou algumas horas de desenvolvimento até sanar o problema.

Estava concluindo uma manutenção de rotina em uma aplicação quando me deparei com um erro, ao fazer uma consulta ao banco de dados. A aplicação estava utilizando o gerenciador MySQL, e o procedimento armazenado tinha como padrão três parâmetros, dois de entrada(IN) e um de saída(OUT), utilizava Nhibernate no ORM, e por padrão, arquitetura GT! No desenvolvendo utilizava linguagem de programação C Sharp da Plataforma Microsoft.  

Ae executar o Script já acessando a camada ORM, uma mensagem de erro dizia:

OUT or INOUT argument 5 for routine base_name.proc_ins_user is not a variable or NEW pseudo-variable in BEFORE trigger

could not execute query
[ call proc_ins_user(?p0, ?p1, ?p2, ?p3, ?p4);] Name:iuser - Value:pedro Name:imail - Value:pedro.teste@gmail61.com Name:istatus - Value:0 Name:iidclient - Value:0 Name:oireturn - Value:0 [SQL: call proc_ins_user(?p0, ?p1, ?p2, ?p3, ?p4);]

A mensagem dizia claramente que um problema era com um ou mais parâmetros de entrada(IN) no caso especificamente com a variável OUT não declarada!

No exemplo, o Script executado era:

 string text = "call proc_ins_user(:iuser, :iemail, :iautoriza, :iidcliente, :oireturn); “
                        var query = session.CreateSQLQuery(text )
                                   .SetParameter("iusuario", usuario, NHibernateUtil.String)
                                   .SetParameter("imail", email, NHibernateUtil.String)
                                   .SetParameter("istatus", status, NHibernateUtil.Int16)
                                   .SetParameter("iidclient", iidcliente, NHibernateUtil.Int16)
                                   .SetParameter("oireturn", retorno, NHibernateUtil.Int16);
                         object obj = query.UniqueResult();

Depois de algumas tentativas, encontrei uma solução, como estávamos utilizando a classe CreateSQLQuery do Nhibernate, modifiquei a query para o contexto:

string text = "call proc_ins_user(:iuser, :iemail, :iautoriza, :iidcliente, :oireturn); select @x; “
                        var query = session.CreateSQLQuery(text )
                                   .SetParameter("iusuario", usuario, NHibernateUtil.String)
                                   .SetParameter("imail", email, NHibernateUtil.String)
                                   .SetParameter("istatus", status, NHibernateUtil.Int16)
                                   .SetParameter("iidclient", iidcliente, NHibernateUtil.Int16)
   				   // retirado o setparameter desta linha
                                   object obj = query.UniqueResult();


Nota-se que não é necessário setar o Parâmetro de entrada(.SetParameter()) para CreateSQLQuery() apenas na string query que denomina-se os nomes dos parâmetros.

A variável @x não é um parâmetro e sim uma variável estática do próprio gerenciador, por ser um parâmetro (OUT) no caso citado não teremos valores para entrada, e sim para saida.

Publicidade

Comentários

Deixe um comentário!

Seu endereço de email não será publicado. Os campos obrigatórios estão marcados *