C# - Criando uma aplicação 3 camadas com MySQL


Este artigo vai mostrar como criar uma aplicação com 3 camadas usando o banco de dados MySQL e a linguagem C#.

Baixe a versão 5 MySQL Community Server , que é gratuito no sítio: http://dev.mysql.com/downloads/

Em seguida baixe também o conector para a plataforma .NET em : http://dev.mysql.com/downloads/connector/net/5.2.html

A instalação padrão é muito simples basta seguir as orientações do assistente. Recomendo alterar a senha do usuário root.

Agora baixe e instale o MySQL Administrator para administrar o servidor MySQL.

Vamos instalar também uma ferramenta gráfica para poder trabalhar com o MySQL para executar consultas e criar stored procedures: MySQL Query Browser

Obs: As duas últimas ferramentas são disponibilizadas em um único pacote em : http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-gui-tools-5.0-r12-win32.msi/from/pick

Haja download , mas em compensação é tudo grátis...

Após terminar a instalação de todas as ferramentas indicas você pode conferir no Windows , Menu Iniciar -> Todos Programas a relação dos programas instalados:

Agora execute o MySQL Administrator e abra o MySQL; se tudo foi realmente instalado corretamente você deverá obter o seguinte resultado:

 
 

Vamos criar o banco de dados Cadastro. Clique com o botão direito do mouse sobre a área do menu inferior selecione Create New Schema;

Em seguida selecione o banco de dados criado e clique com o botão direito do mouse selecionando a opção Create New Table;

Defina então a estrutura da tabela Alunos com os campos conforme figura exibida a seguir;

Abra o MySQL Query Browser e usando a instrução SQL INSERT INTO inclua alguns valores na tabela conforme figura abaixo;

Para exibir os dados incluídos execute a instrução SELECT conforme a figura a seguir;

Já temos o banco de  dados Cadastro e a tabela Alunos criados no banco de dados MySQL. Vamos criar agora uma aplicação usando 3 camadas.

Se fala muito em camadas ultimamente mas o conceito é antigo e tem como objetivo separar a lógica de negócio da interface e do acesso aos dados de forma a facilitar a manutenção e a escalabilidade da aplicação.

Eu vou usar o Visual C# 2008 Express para criar a nossa aplicação com 3 camadas. Abra o Visual C# e crie um novo projeto do tipo Windows Forms Application com o nome de TresCamadas;   

Nossa aplicação será constituída de :

A primeira coisa que vamos fazer é definir a string de conexão com o banco de dados Cadastro do MySQL no arquivo App.config conforme o código:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

   <appSettings>

      <add key ="ConexaoBD" value="uid=root; password=******; database=Cadastro"/>

   </appSettings>

</configuration>

A string de conexão acima esta usando a porta padrão 3306. O servidor padrão é localhost.

A seguir temos algumas strings de conexão possíveis:

Padrão Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
Definindo a porta
Server=myServerAddress;Port=1234;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
Usando criptografia
Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword; Encryption=true;

myServerAddress= o nome do servidor   myDataBase= o nome do banco de dados myUsername= nome do usuário myPassword=senha

Agora vamos definir a camada de negócios no projeto;

No menu Project opção Add New Item selecione o template Class e informe o nome Alunos.cs;

A seguir inclua o código abaixo na classe Alunos.cs;

using System;

namespace Macoratti

{

/// <summary>

/// Descrição para a classe Alunos que representa um aluno

/// </summary>

public class Alunos

{

 

private int _alunoID;

public int AlunoID

{

get

{

    return _alunoID;

}

set

{

    _alunoID = value;

}

}

 

private string _nome;

public string Nome

{

get

{

   return _nome;

}

set

{

   _nome = value;

}

}

 

private string _endereco;

public string Endereco

{

get

{

   return _endereco;

}

set

{

   _endereco = value;

}

}

 

private int _idade;

public int Idade

{

get

{

  return _idade;

}

set

{

  _idade = value;

}

}

public Alunos()

{

}

 

public Alunos(string nome,string endereco, int idade)

{

   this.Nome = nome;

   this.Endereco = endereco;

   this.Idade = idade;

}

}

}

A classe Alunos possui definidos :

 - 4 propriedades :

  • AlunoID
  • Nome
  • Endereco
  • Idade

- dois construtores

  • Sem argumentos ;
  • Com 3 argumentos : nome, endereco e idade;

A classe tem o objetivo de representar um objeto Aluno definindo as propriedades codigo, nome, endereco e idade e dois construtores;

Agora vamos criar uma nova classe chamada AlunosBD.cs que será responsável por acessar e tratar os dados, e incluir nela o seguinte código:

using System;

using System.Data;

using System.Data.SqlClient;

using System.Collections;

using System.Configuration;

using MySql;

using MySql.Data;

using MySql.Data.MySqlClient;

namespace Macoratti

{

/// <summary>

/// descricao para a camada de acesso a dados

/// </summary>

public class alunosDB

{

string Con;

//obtem a strind e conexão do arquivo App.config

public alunosDB()

{

Con = ConfigurationSettings.AppSettings["ConexaoBD"];

}

 

//inclui um novo aluno na tabela

public void IncluirAluno(Alunos alunos)

{

MySqlConnection CN = new MySqlConnection(Con);

MySqlCommand Com = CN.CreateCommand();

Com.CommandText = "INSERT INTO Alunos(nome,endereco,idade) Values(?nome,?endereco,?idade)";

Com.Parameters.AddWithValue("?nome", alunos.Nome);

Com.Parameters.AddWithValue("?endereco", alunos.Endereco);

Com.Parameters.AddWithValue("?idade", alunos.Idade);

try

{

CN.Open();

int regitrosAfetados = Com.ExecuteNonQuery();

}

catch(MySqlException ex)

{

throw new ApplicationException(ex.ToString());

}

finally

{

CN.Close();

}

}

//Obtem todos os alunos da tabela

public DataTable getAlunos()

{

MySqlConnection CN = new MySqlConnection(Con);

MySqlCommand cmd = CN.CreateCommand();

MySqlDataAdapter da;

cmd.CommandText = "SELECT * from Alunos";

try

{

CN.Open();

cmd = new MySqlCommand(cmd.CommandText,CN);

da = new MySqlDataAdapter(cmd);

//

DataTable dtAlunos = new DataTable();

da.Fill(dtAlunos);

return dtAlunos;

}

catch (MySqlException ex)

{

throw new ApplicationException(ex.ToString());

}

finally

{

CN.Close();

}

}

}

}

 

A classe AlunosBD possui dois métodos:

A classe possui um construtor que obtêm a string de conexão contida no arquivo App.Config;

Vamos criar a camada de interface usando o formulário Form1.cs;

inclua no formulário os controles Label, TextBox , Button e DataGridView conforme o leiaute da figura abaixo:

A seguir vamos mostrar como as camadas estão definidas na aplicação e como elas se comunicam.

Tenha uma coisa em sua mente, quando se fala em camadas, não estamos falando em camadas físicas separadas, mas em camadas lógicas.

A figura abaixo é um esquema bem simples de como tudo acontece:

A camada de apresentação solicita uma informação e a envia para a camada de negócios Aluno.cs , nesta classe temos a representação dos objetos Alunos;

Obs: Na verdade a classe aluno.cs seria um Data Transfer Object ( DTO) e não uma camada. Se bem que eu poderia aproveitar a classe e incluir nela o código para a camada de negócios, o que não é usual, mas possível.  Como é um artigo introdutório eu vou considerar a classe aluno.cs como a camada de negócios mas em outros artigos eu vou criar a BLL separada e que vai usar a DTO onde temos a representação das entidades do negócio. Rigorosamente falando teríamos aqui não 3 mas 2 camadas.

A camada de acesso a dados, AlunosBD.cs,  recebe a solicitação e a envia para o banco de dados MySQL retornando a informação para a camada de apresentação.

Na verdade o nosso exemplo é muito simples e poderia ser incrementado para melhor ilustrar o comportamento mas o objetivo é ser bem simples para que os que estão iniciando agora possam compreender melhor.

 Vejamos então o código do botão Salvar :

private void button1_Click(object sender, System.EventArgs e)

{

if (txtNome.Text.Equals(""))

{

  MessageBox.Show("Informe o nome do aluno.");

   return;

}

try

{

 

   alunosDB alunoBD = new alunosDB();

  Alunos alunoReg = new Alunos(txtNome.Text, txtEndereco.Text, int.Parse(txtIdade.Text));

   alunoBD.IncluirAluno(alunoReg);

    MessageBox.Show("Registro salvo com sucesso.");

   button2.PerformClick();

}

catch(Exception c)

{

MessageBox.Show(c.ToString());

}

}

Ao clicar no botão Salvar o código faz uma validação simples e cria uma instância da classe AlunosBD() para em seguida criar uma instância da classe Alunos();

Observe que estamos passando um objeto Aluno para o método incluirAluno() - alunoBD.IncluirAluno(alunoReg);

A camada de acesso a dados recebe então os parâmetros e acesso o banco de dados;

Vejamos agora o código do botão Limpar :

private void button2_Click(object sender, System.EventArgs e)

{

alunosDB alunoBD = new alunosDB();
 

  txtID.Text="";

  txtNome.Text="";

  txtEndereco.Text="";

  txtID.Focus();

  dgvAlunos.DataSource = alunoBD.getAlunos();

}

 

O código cria uma instância da classe de acesso a dados , limpa os controles e chama o método getAlunos() que retorna um DataTable. O adequado seria o método retornar uma coleção de Alunos, mas para tornar mais simples o código optei por este método.

Embora não tenhamos implementando uma lógica 100% orientada a objetos ela é um passo além daquele velho costume de colocar todo o código embutido no formulário. Tenha certeza que desta forma você ganha em ter um código mais limpo e fácil de manter.

Pegue o projeto completo aqui: TresCamadas.zip (sem a base de dados MySQL)

Até o próximo artigo .NET.

referências:

MySQL - Vinculando , Importando e Exportando tabelas do Access
Visual Basic - Acessando MySQL com ADO usando um Driver ODBC
Visual Basic - Acessando MySQL com ADO
VB  e  MySQL -  Gerenciando dados
MySQL - Distribuindo o MySQL com sua aplicação
MySQL - Operações básicas com SQL
ASP.NET - Acesso ao MySQL
Trabalhando com aplicações em 3 camadas
ObjectDataSource - Trabalhando em camadas
VB.NET - Criando uma aplicação em 3 camadas
Trabalhando com aplicações em 3 camadas - Parte IV
ASP.NET - Trabalhando em camadas


José Carlos Macoratti