TemplateReader em outro lugar

3 views
Skip to first unread message

Marcos George

unread,
Apr 3, 2009, 7:19:52 AM4/3/09
to Infra - Integrated Frameworks
Na minha opinião o TemplateReader é uma classe que poderia ser movida
de lugar. Ele poderia ir pra dentro de SqlCommand (ou melhor, de SQL):

SqlCommand.SQL.ReadFromFile() <<= usando um TemplateReader de arquivo
SqlCommand.SQL.ReadFromXml() <<= usando outro TemplateReader para Xml
SqlCommand.SQL.ReadFromDB() <<= ou ainda outro para leitura apartir de
um banco de dados...

Assim, as coisas ficariam mais simples e intuitivas. O que vcs acham?

Att
Marcos George

Fabricio Colombo

unread,
Apr 3, 2009, 7:59:01 AM4/3/09
to infra...@googlegroups.com
Pelo que entendi, o TemplateReader pode ser usado para carregar qualquer coisa de uma origem qualquer (desde que implementado conforme a necessidade). Nesse caso ele poderia estar dentro de sql para simplificar a carga, mais acho que não deveria ser movida para lá.

2009/4/3 Marcos George <mgnd...@msn.com>

Marcos George

unread,
Apr 3, 2009, 8:35:53 AM4/3/09
to infra...@googlegroups.com
No caso, o "movida" não quer dizer fisicamente, mas o seu uso, que hj é feito pelo PersistenceEngine e passaria a ser pela outra classe em questão. Ok?

Att
Marcos George



 

Date: Fri, 3 Apr 2009 08:59:01 -0300
Subject: [Infra 680] Re: TemplateReader em outro lugar
From: fabricio.c...@gmail.com
To: infra...@googlegroups.com

Marcos Barreto

unread,
Apr 3, 2009, 12:44:35 PM4/3/09
to infra...@googlegroups.com

Eu nao acho. não precisamos da SQL até que ela esteja próxima de ser executada, nao tem por que expor isso para o programador no SQLCommand. Seria uma forma a mais de fazer algo que o framework já faz sozinho.

No configuration dá para se definir tudo, como as sqls seriam carregadas, etc. Nenhum programador vai carregar parte de suas sqls do DB e parte do XML, acho que é uma complexidade que nao precisamos. E não quero dizer aqui que parte das sqls nao possam ser geradas automaticamente e partes lidas de outro tipo de templatereader ok?

Acho que temos coisas mais importantes como o TemplateReader que vai gerar instruções automáticas.

Marcos George

unread,
Apr 3, 2009, 1:32:04 PM4/3/09
to infra...@googlegroups.com
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.com
To: infra...@googlegroups.com

Solerman Kaplon

unread,
Apr 3, 2009, 2:14:38 PM4/3/09
to infra...@googlegroups.com
Marcos George escreveu:
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.

Isso é legal, mas quando se usa parâmetros via substituição (ou mesmo com uma engine que comporte regiões de SQL opcionais), isso vai obrigar a definir todos os parâmetros pela template mesmo que eles não tenham uso algum. No meu entender, você definir os parâmetros que você tem a mão, e a template usa-os conforme precisa. Se depois você tiver um parâmetro que não é mais usado na template, pode mudá-la sem ter que passar no programa mexendo porquê aí passaria a dar erro que o parâmetro não existe.
Isso é algo que o delphi faz com alguns tipos de dataset mas que tem pouco valor prático, em qualquer um dos casos não vai funcionar e a menos que use templates dinâmicas, vai notar de forma óbvia que não funciona no primeiro teste (de preferência unitário).

Solerman

Marcos George

unread,
Apr 3, 2009, 2:28:37 PM4/3/09
to infra...@googlegroups.com
>Isso é legal, mas quando se usa parâmetros via substituição (ou mesmo
>com uma engine que comporte regiões de SQL opcionais), isso vai obrigar
>a definir todos os parâmetros pela template mesmo que eles não tenham
>uso algum.
 
Nao entendi. Poderia explicar melhor o que vc quis dizer com "isso vai obrigar a definir todos os parâmetros pela template mesmo que eles não tenham uso algum"? Em que casos vc precisaria ter um template com parametros a mais ou menos daqueles definidos no programa?

Att
Marcos George
 


Descubra quais produtos Windows Live tem mais a ver com você! Faça o teste!

Marcos Barreto

unread,
Apr 3, 2009, 10:08:24 PM4/3/09
to infra...@googlegroups.com
  vSqlCommand := vSession.CreateNamedQuery('LoadAccountByID');
  vSqlCommand.Params['ID'] := 10; // <<-- Observe isto 
  vAccount := vSqlCommand.GetResult as IAccount;

vSqlCommand.Params hoje é um Map, cujo item tem: Index como string e Value como InfraType então o correto seria:
vSqlCommand.Params['ID'] := TInfraInteger.NewFrom(10);

Com isso ai realmente o programador fica pensando que o parametro ID já existe no map Params, o que não é verdade.
Por ser um map ao se definir o Params['ID'] := TInfraInteger.NewFrom(10); se o ID ainda nao estiver na lista ele é adicionado automaticamente.

Solerman Kaplon

unread,
Apr 4, 2009, 8:14:49 AM4/4/09
to infra...@googlegroups.com
Marcos George escreveu:
Nao entendi. Poderia explicar melhor o que vc quis dizer com "isso vai obrigar a definir todos os parâmetros pela template mesmo que eles não tenham uso algum"? Em que casos vc precisaria ter um template com parametros a mais ou menos daqueles definidos no programa?

Assim, pegue esta template:

Select codigo, nome from Pessoas Where Empresa = :Empresa and Codigo = :Codigo; // chave composta

no programa obviamente se define dois parâmetros. Agora, depois de um tempo, você resolve mudar a PK para ser somente Codigo. Se você aceitar parâmetros que não estão definidos, não precisa alterar nada no programa. Se não aceitar, vai ter que passar todos os usos da template removendo o parâmetro de empresa (mesmo que sistematicamente isso não faça diferença).

Solerman
Reply all
Reply to author
Forward
0 new messages