Desenvolvimento - C#

Cadastro de um Consultório em Windows Forms, com C# e SQL Server – Parte 9

Nesta 9ª parte da série de artigos iremos criar as classes e os métodos que herdarão da classe de acesso a dados.

por Wellington Balbo de Camargo



Olá pessoal, continuamos nossa série de artigos criando aplicações simples em Windows Forms usando a linguagem C# e o banco de dados SQL Server.     

Nesta parte iremos criar as classes e os métodos que herdarão da classe de acesso a dados. Confiram:

Crie a classe AcessoDadosPaciente, que herdará da nossa classe de acesso a dados. Agora vou mapear os campos da minha tabela como propriedades dessa minha classe herdada. Declare a propriedade privada _nCodPaciente:

Para que ela se torne um campo, precisamos usar o Refactor do Visual Studio (ou você pode fazer na mão). Para isso clico com o botão direito em cima dessa propriedade privada, clico em Refactor > Encapsulate Field e dou um nome diferente a ela (geralmente seria o nome quase igual da propriedade privada apenas sem o underline), como mostra a imagem a seguir:

O que me resultará no campo abaixo:

Faça o mesmo com mais duas propriedades, sNomePaciente e sNumTelefone. O resultado final será esse:

Agora vamos implementar os métodos criados anteriormente na classe de Acesso a Dados. Logo abaixo chame o método de Salvar (lembrando que usamos o override para sobrescrever os métodos virtuais de acesso a dados):

Antes de fazer o método sobrescrito de Salvar, declarei o Consultas.dsConsultaTableAdapters. Após isso, crio o método Salvar, muito parecido com o que foi feito em outras páginas do projeto, só que a diferença será que agora a nossa classe de Acesso a Dados que irá abstrair esse método. Assim declaro minha variável bSalvar, instancio o TableAdapter, faço a comparação descrita na imagem acima: se estiver gravando no banco, chamo o ta.Insert, passando os parâmetros declarados em nossa classe, referentes ao nome do paciente e ao numero do telefone. Uso no final o maior que 0 apenas para dizer que minha variável bSalvar será gravada/atualizada somente se houver algum registro, ou seja, se for maior que 0. Se não estiver gravando no banco, está atualizando, então chamo o ta.Update, faço a mesma coisa, só que passo 3 parâmetros: o nome do paciente, o número do telefone e o código do paciente.

Lembrando: preciso preencher essas propriedades antes de chamar esse método de Inserção e/ou Atualização.

Fazendo desta forma, meus formulários não precisam acessar diretamente o TableAdapter para obter os dados, já que minha classe de Acesso a Dados fará isso.

Como teste, abra o formulário Paciente Herdado e vá ao método Salvar. Vamos experimentar usar o método de nossa classe de Acesso a Dados. Para isso, comente o código do botão de Salvar do formulário e faça o seguinte código:

Comentei todo o código que usávamos para Salvar e, apenas instanciando a classe de Acesso a Dados, fiz o mesmo método, preenchendo as propriedades e passando os parâmetros. Além de economizar linhas de código, uso o conceito de MVC, já que dessa forma meu formulário não precisa usar os métodos de acesso a dados diretamente. Ele apenas chama a classe responsável por isso, no caso a de Acesso a Dados. Outro ponto importante a se destacar é o fato de que, quaisquer validações que precisarmos fazer,  é só fazer nas classes de dados. Assim não precisaremos se preocupar em ir, formulário a formulário, validando o que precisa, só fazemos uma única vez. Mais pra frente, quando formos implementar essa forma de trabalhar com MVC nos outros métodos, não precisaremos mais chamar o TableAdapter em nosso form como chamamos atualmente:

Vamos agora sobrescrever os outros métodos. Volte a classe de Acesso a Dados e, logo abaixo do método Salvar, chame o método Delete e insira o seguinte código (muito parecido com o código do método Salvar):

Chame agora o método PesquisaID (o que tem parâmetro), que é parecido com o método Delete (a diferença é que nele usamos o parâmetro nCodGenerico e precisamos instanciar o DataTable, além é claro do TableAdapter) e insira o seguinte código:

Chame o PesquisaID. Como este método não possui parâmetros, vamos chamar os atributos declarados no início de nossa classe, referentes as colunas de nossa tabela. Insira o seguinte código:

Como o método é do tipo DataRow, apenas retorno o DataTable PesquisaID, que fizemos anteriormente, e passo o comando Rows[0], que indica que quero pegar o 1º índice (ou 1ª linha) de meu DataRow.

Simples né? Agora vamos ao PesquisaNome, que é praticamente igual ao PesquisaID (com parâmetro), só precisamos trocar o parâmetro, que é string, e o método:

Pronto, os métodos estão sobrescritos.

Temos situações em que, precisamos passar todos os campos, outras em que precisamos passar o nome e o telefone, outros em que preciso passar somente o código, quando for Pesquisa, por exemplo, etc. Para não ter o trabalho de sempre ter de preencher todas as propriedades, devemos sobrescrever o construtor da minha classe, desta forma:

Descrição: AcessoDadosPacienteConstructor1.JPG

Desta forma, em branco, sem receber nenhum parâmetro nem valor.

Agora, crio outros construtores, analisando aquelas situações descritas acima, em que posso passar apenas o código, ou o nome e telefone, etc. Confira:

Assim não terei o trabalho de instanciar as classes, chamar as propriedades e preenchê-las, já meu construtor servirá pra isso.

Dessa forma, teremos 4 construtores: um que não terá parâmetro algum, um que terá o código do paciente, para quando precisarmos fazer Pesquisas por ID, um que passo o código, o nome e o telefone, quando for atualização, por exemplo, e um construtor que passarei somente o nome e o telefone, quando for uma inserção. Assim percebam que podemos customizar nossas classes de acordo com nossas necessidades.

Os valores que são passados como parâmetros, são repassados às propriedades criadas no começo do código.

Vamos então fazer as modificações necessárias nos outros métodos de nosso formulário Paciente Herdado, como fizemos com o método Salvar acima.

Abra esse form, abra o método Delete e faça o digite o seguinte código:

Primeiramente, comente (ou exclua) o using acima, já que não iremos mais utilizar o DataSet nessa página, pois nossa classe de Acesso a Dados que é a responsável por se conectar ao banco. Agora instanciamos a classe, usamos o 2º construtor que criamos, que tem como parâmetro o código, então passamos o _nCodGenerico, que é preenchido pelo Localizar e o usaremos para Excluir o registro. Finalizando apenas retorno o método Delete, criado na classe. Em resumo, tenho uma produtividade no código, pois o que antes gastávamos 4 linhas, hoje gastamos apenas 2. Pode parecer pouco, mais imagina em um sistema grande, com milhares de páginas e linhas de código. Isso aumenta e muito a produtividade e a facilidade de dar manutenção, caso ocorra algum erro.

O método Localizar não iremos alterar neste form, já que precisamos alterá-lo no form de Pesquisa. Vá ao método CarregaValores e insira o seguinte código:

Aqui eu instancio minha classe, passo como parâmetro o _nCodGenerico, da mesma forma que o método Excluir, instancio um DataRow(que retorna apenas uma linha), passo a ele a classe instanciada chamando o método PesquisaID, aquele método sem parâmetro, já que quero apenas retornar uma linha. Senão passaria o outro método, do tipo DataTable. Depois verifico, se o DataRow for diferente de nulo, preencho os campos que desejo, usando as propriedades declaradas na classe, atribuídas aos valores do formulário.

Abra agora o formulário Pesquisa Paciente, vá ao método Pesquisar e insira o seguinte código:

Perceba que nesse método pouca coisa mudou. A diferença é que antes meu DataTable recebia um TableAdapter, que chamava os métodos de Pesquisa. Agora não, quem faz isso é minha classe de Acesso a Dados.

Salve tudo e compile, vamos testar o projeto. Clique em Pacientes, Novo, digite um nome e um telefone e clique em Salvar. Se o seu projeto está igual o meu, então houve um erro!

Este erro aponta que meu lblCodigo está vazio ou em um formato incorreto. Porque ainda não temos o código do Paciente. Para isso, devemos fazer a seguinte alteração (lembrando que estamos no método Salvar, do formulário Paciente Herdado):

Faço uma simples verificação, se o status for Editando, preciso preencher o código do Paciente. Se for inserção, não há essa necessidade. Agora compile, grave um novo registro, clique em Localizar, teste a busca, deverá estar funcionando corretamente. Agora dê dois cliques no resultado da busca, exclua o registro e perceba que o código não foi excluído.

Como não podemos simplesmente ir ao método Excluir e apagar o label manualmente, já que temos rótulos diferentes, temos que ir ao formulário base, irmos ao método LimpaControles, dentro do foreach dos controles, fazermos um if no controle do tipo Label, e excluirmos somente o lblCodigo, que é o nome de nosso label (se o label de seu form tiver outro nome, altere-o no if). Para isso, vá ao formulário Base e insira o seguinte código:

Descrição: TheCodeIsClean.JPG

Assim utilizamos facilmente o conceito de Herança, já que não precisamos ir toda vez no método Excluir, e sim apenas uma vez no método LimpaControles.

Finalizando, deixo um desafio a vocês. Para que implementem o Cadastro de Médicos, usando esses conceitos de Herança Visual, abordados nos artigos anteriores, e principalmente os conceitos de MVC. No final do próximo artigo, estarei disponibilizando o código-fonte completo do Cadastro de Médicos.

Para quem se interessar, estou disponibilizando para download o que fizemos até esta parte do artigo em nosso sistema. Para baixar, clique aqui.

 Na próxima parte de nossa série de artigos, iremos criar a classe, os métodos e o formulário de Cadastro de Consultas, com algumas diferenças em relação ao Cadastro de Pacientes e alguns métodos a mais. Usaremos também LINQ em nossos métodos. Não perca!

 Créditos à Luciano Pimenta, que fez as videoaulas e ao Portal Linha de Código, por onde pude baixá-las (mediante assinatura), estudá-las e posteriormente fazer este artigo.

 Quaisquer dúvidas, mandem emails para wellingtonbalbo@gmail.com ou deixem nos comentários deste artigo que responderei o mais breve possível.

 Até o próximo artigo!

Wellington Balbo de Camargo

Wellington Balbo de Camargo - Desenvolvedor Web/Desktop em .NET, com pouco mais de 1 ano de experiência na área. Cursando o 4º Semestre de Análise de Sistemas, atualmente estuda para melhorar os conhecimentos em SQL Server e ASP.NET, buscando em um futuro próximo as certificações Microsoft nessas áreas. Mantém um blog com dicas e artigos para iniciantes em .NET no endereço http://programandodotnet.wordpress.com e nas horas vagas procura ajudar e aprender com o pessoal do Fórum daMSDN. Atualmente é editor de artigos da Linha de Código.