Nesta última parte do artigo finalizaremos os nossos teste

Muito bem, podemos agora codificar o Program.cs para testarmos o funcionamento do projeto. Na classe Program.cs adicione os seguintes “usings”:


using System;using System.Collections.Generic;using System.IO;using TestProject.Model;

using TestProject.BO;

Depois, dentro da classe Program crie o seguinte método:


static byte[] GetFile()

        {

            byte[] buffer = null;

            string fileName = @"C:\teste.jpg";

            FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);

            BinaryReader br = new BinaryReader(fs);

            long numBytes = new FileInfo(fileName).Length;

            buffer = br.ReadBytes((int)numBytes);

            return buffer;

 

        }

Este método pega os bytes de um arquivo qualquer no disco. Modifique a linha string fileName = @"C:\teste.jpg" para apontar para ajgum arquivo no seu disco rígido. Vai servir para inserirmos uma array de bytes no campo “prod_img_bytes”, do BD. Esse campo é do tipo image.

Agora dentro do método Main adicione os seguintes comandos:


Produto prod = new Produto();

prod.Desc = "Teste Produto Update 12";

prod.Id = 2;

prod.Imagem = "1231232132132";

prod.Nome = "Teste Insert";

prod.Preco = Decimal.Parse("125,77");

prod.Url = "jodijfosi";

prod.ImagemByte = GetFile();

Nesse bloco de comandos apenas instanciamos um objeto do tipo Produto (classe model) e setamos suas propriedades. Note que utilizamos o método “GetFile()”, que retorna um array de bytes, referentes a um arquivo.

Vamos agora testar o método “TestaInsertUpdateTrans” da classe ProdutoBO:


ProdutoBO boProduto = new ProdutoBO();

boProduto.TestaInsertUpdateTrans(prod);

Console.WriteLine("Produto '{0}' Inserido e alterado com sucesso", prod.Id);

Console.WriteLine();

Console.ReadKey();

Antes de testarmos, vou colocar o método Main completo da classe Program:


static void Main(string[] args)

        {

            try

            {

                Produto prod = new Produto();

                prod.Desc = "Teste Produto Update 12";

                prod.Imagem = "1231232132132";

                prod.Nome = "Teste Insert";

                prod.Preco = Decimal.Parse("125,77");

                prod.Url = "jodijfosi";

                prod.ImagemByte = GetFile();

 

                ProdutoBO boProduto = new ProdutoBO();

                boProduto.TestaInsertUpdateTrans(prod);

                Console.WriteLine("Produto '{0}' Inserido e alterado com sucesso", prod.Id);

                Console.WriteLine();

                Console.ReadKey();

 }

            catch (Exception ex)

            {

                if (ex.InnerException == null)

                {

                    Console.WriteLine(ex.Message);

                }

                else

                {

                    Console.WriteLine(ex.InnerException.Message);

                }

            }

            finally

            {

                Console.ReadKey();

            }

           }

Vamos testar nossa aplicação e ver o resultado na tela:


Ilustração 15 – Resultado do método que insere um produto

No meu caso, como já existem alguns produtos cadastrados na tabela, o sistema retornou o id 97. Vamos olhar no BD o produto com ID 97:

Ilustração 16 – Registros da tabela Produto

Vemos aqui que tudo foi inserido e alterado corretamente, inclusive o campo prod_img_byte que é um image.

Vamos agora testar o método da classe ProdutoBO que retorna uma lista de produtos. Vamos adicionar os seguintes comando ao método Main da classe Program:


Console.Clear();

 

                List listRetorno = boProduto.GetListaSemFiltro();

 

                if (listRetorno.Count > 0)

                {

                    foreach (Produto pro in listRetorno)

                    {

                        Console.WriteLine("ProdutoId = " + pro.Id + " imagem_Byte = " + pro.ImagemByte.Length);

                    }

                }

 

                Console.ReadKey();

Instanciamos um List do tipo Produto e chamamos o método GetListaSemFiltro do objeto ProdutoBO. Caso o método retorne algum registro, percorremos a lista para imprimir na tela os IDs dos produtos da lista.

Rodando o programa teremos as seguintes telas:


Ilustração 17 – Resultado da inserção de produto

Essa tela demonstra que mais um produto foi incluido e alterado, pois é o resultado do primeiro método que testamos.


Ilustração 18 – Resultado do teste que retorna a lista de produtos contidos no banco

Essa tela demonstra que o método que retorna a lista de produtos funcionou corretamente.

O próximo passo é testar a funcionalidade que possibilita a operação com diversos BDs. Para ganharmos agilidade, eu repliquei to o BD TESTE para um outro BD chamado TESTE2 e criamos a connection string de nome “sqlServerConn2” no ApConfigo do nosso Console Application.

Logicamente o leitor poderá criar ou utilizar outro BD de sua preferência.

Com o outro BD criado, dentro da classe ProdutoBO, vamos adicionar o seguinte método:


  public List TestaBDTeste2(Produto pObj)

{

  List retorno = null;

  using (base.TransactionScope("sqlServerConn2"))

  {

     this.ExecuteProcInsert(pObj);

     pObj.Nome = "teste BD2";

     this.ExecuteProcUpdate(pObj);

     retorno = base.ExecuteProcSelectNoFilter();

   }

   return retorno;    

}

Este método irá acessar o BD TESTE2, fará um insert, um update e retornará a lista de produtos.

Na classe Program.cs, dentro do método Main adicione os seguintes comandos



[Console.Clear();

                List listRetornoBD2 = boProduto.TestaBDTeste2(prod);

                if (listRetornoBD2.Count > 0)

                {

                    foreach (Produto pro in listRetornoBD2)

                    {

                        Console.WriteLine("ProdutoId do BD2 = " + pro.Id + " imagem_Byte = " + pro.ImagemByte.Length);

                    }

                }

 

                Console.ReadKey();

Basicamente instanciamos uma nova lista de produtos e atribuimos seu valor ao retorno do método TestaBDTeste2. Passamos como parâmetro a esse método o objeto prod que foi criado anteriormente. Caso o método finalize corretamente, percorremos a lista e imprimimos os IDs dos produtos.

Rodando a aplicação teremos a seguinte tela, além daquelas que já vimos em nossos testes anteriores:

Ilustração 19 – Resultado do método que acessa outro BD para retonar uma lista de produtos

Agora que verificamos que nossa classe DAL funciona corretamente, vamos fazer um teste alternativo. Vamos retirar um atributo da classe model e rodar o programa.

Vamos comentar a declaração do atributo [AttDataAccessType(DataAccesType.Both)] , Como demonstra a figura a seguir:

Ilustração 20 – Retirada do atributo “AttDataAccessType”

Ao rodar o programa temos a seguinte mensagem de erro:

Ilustração 21 – Mensagem de erro

O leitor pode tomar a liberdade de tirar mais alguns atributos como os das propriedades da classe Produto e ver o resultado na tela. Poderá também retirar a chave contida no app.config para ver a mensagem de erro retornada.

3. Considerações Finais

Chegamos ao final de nosso artigo. Vimos nele o que podemos fazer com algumas das funcionalidades mais básicas da Namspace Reflection combinadas com outras. Vimos também outras coisas interessantes como Type Parameters, Interfaces, Attributes etc.

Gostaria de lembrar novamente que o projeto que criamos tem fins didáticos apenas. Porém se ele for incrementado, poderá muito bem ser utilizado em ambientes de trabalho.

Nosso projeto de exemplo foi bastante simples, tinha apenas uma Tabela no BD. Porém, deu para termos noção de como podemos nos beneficiar das técnicas que utilizamos. Imaginemos uma situação em que um projeto contenha 200 tabelas e/ou SPs. Utilizando a arquitetura de três camadas, teríamos que codificar as camadas Model e Business, porém a camada DAL não precisaria ser criada. Em outras palavras, deixaríamos de criar e digitar cerca de 200 classes com códigos extremamente repetitivos, o que sem dúvida é um ganho de produtividade.

Implementamos também, a independência de Banco de Dados, o que também nos dá um ganho enorme de produtividade, caso precisemos modificar o BD de nossos projetos. Vimos também como realizar o mapeamento Objeto/Relacional

Peço desculpas, pois em alguns momentos negligenciei algumas boas práticas de programação para poder desenvolver o artigo e o projeto de exemplo a tempo. Mas fica a deixa para os leitores melhorarem o projeto.

Nos próximos artigos veremos como criar scripts de criação de SPs e de geração de comandos SQL basicamente utilizando a mesma técnica que vimos neste artigo.

Agradeço a todos e espero ter contribuído em algo.

Se o leitor tiver críticas, sugestões ou queira obter o código fonte do projeto, por favor entre em contato - leandro_vca@hotmail.com

Obrigado.