Talvez vc não tenha atentado pro fato de que uma vez que eu tenha um template com parâmetros, e haja a necessidade de preencher os valores desses parâmetros, não poderia fazê-lo de forma segura se o SqlCommand ainda não tiver carregado o template no momento de preencher os parâmetros.
vSqlCommand := vSession.CreateNamedQuery('LoadAccountByID');
vSqlCommand.Params['ID'] := 10; // <<-- Observe isto
vAccount := vSqlCommand.GetResult as IAccount;
Da forma como está implementado hj, vc preenche os parâmetros antes que o template seja lido. Se o parâmetro não existir ou for digitado de forma incorreta, não será possível verificar isto antes de GetResult, momento em que será feita a carga do template. Eu até fiquei curioso de saber como era possível que vc definisse os parâmetros antes de carregar o template e fui investigar. Vi que vc poderia colocar qualquer nome de parametro que desejasse que ele não retornaria erro no SetParam, o erro só acontece bem depois. Isto me parece um tanto estranho e acho que seria melhor fazer a setagem dos parametros quando já fosse possível determinar se seus respectivos nomes estão corretos.
Agora, observe o que acontece nesse caso:
vSqlCommand := vSession.CreateNamedQuery('LoadAccountByID');
vSQLCommand.Params.ValueOfPosition(0).Assign(TInfraInteger.NewFrom(1));
vAccount := vSqlCommand.GetResult as IAccount;
Estou enganado, ou isso deveria funcionar? Se a resposta é sim, então temos um BUG aqui, pq resulta em um AV.
Isto reforça a minha idéia de que o template deveria ser lido antecipadamente para que as devidas validações na setagem dos parametros seja possível.
Att
Marcos George
Date: Fri, 3 Apr 2009 13:44:35 -0300
Subject: [Infra 689] Re: TemplateReader em outro lugar
From:
mrba...@gmail.comTo:
infra...@googlegroups.com