Olá amigos! Neste artigo vamos conhecer o que é uma Enumeração, tanto em .NET, quanto no mySQL e como ela pode te ajudar nos seus projetos diários.
Clique aqui para dar download no projeto de exemplo.
O que é Enumeração?
Enumeração é um tipo de variável que vincula um valor constante numérico a um nome (string). Como exemplo, podemos dizer que se assemelha muito de uma lista. Por exemplo, queremos definir níveis fixos de usuários no nosso sistema.
- Administrador
- Diretor
- Gerente
- Analista
- Estagiário
- Visitante
Outro exemplo é se quisermos especificar tipos de animais que o nosso sistema de pet-shop aceita.
- Cachorro
- Gato
- Peixe
- Pássaro
- Outros
Note que para nós, 1 é cachorro, 2 é gato, 3 peixe , 4 Pássaro e 5 Outros. Para um sistema é sempre mais rápido trabalhar com números, do que com palavras. Quando salvamos estas informações em banco de dados, também pode nos ajudar a diminuir o espaço em disco, pois salvar 1, ocuparia menos espaço em disco do que salvar “Cachorro”. Ainda mais se multiplicarmos por mil, dez mil, ou um milhão de registros.
Podemos salvar o valor da enumeração em um campo numérico, como por exemplo um tinyInt(1), caso o seu banco de dados não suporte enumeração. Porém, recomendo utilizar campo do tipo enumeração, caso o seu banco de dados suporte.
Como exemplo, vamos utilizar o mySQL. Caso não utilize o mySQL, pule a próxima parte deste artigo, e vá para a sessão “Mãos à obra”.
Enumeração no mySQL
Em banco de dados, como o mySQL.
Vamos criar uma tabela (tblanimais) para armazenar os animais no sistema de pet-shop.
Campo Tipo
—— ————————————————–
ID int(11)
Tipo enum(‘Cachorro’,’Gato’,’Peixe’,’Passaro’,’Outros’)
Idade int(11)
Nome varchar(255)
O Create table ficaria assim:
CREATE TABLE `tblanimais` (
`ID` int(11) NOT NULL auto_increment,
`Tipo` enum('Cachorro','Gato','Peixe','Passaro','Outros') default NULL,
`Idade` int(11) default NULL,
`Nome` varchar(255) default NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 Ao criar a enumeração na tabela, passamos os tipos, diretamente no create table.
Um comando de insert ficaria assim:
Insert into `animais`(`ID`,`Tipo`,`Idade`,`Nome`) values ( NULL,'Cachorro','14','Rufos')Note que passamos a string, no tipo de enumeração.
Mesmo salvando “string”, por de baixo dos panos uma enumeração possuí uma performance melhor do que se utilizássemos um campo varchar, por exemplo.
Pré-requisitos
- Este artigo foi montado nas configurações abaixo. Não foi testado em outros ambientes.
- Framework ASP.NET 2.0 com VB.net
- Visual Studio 2005.
Mãos a obra
Vamos criar um sistema bem simples, só para entender como utilizar a enumeração com .NET.
Modelo da tela de exemplo a ser criada
Crie um projeto web (pode ser em Vb.net ), e adicione um diretório chamado App_Code, caso ainda não exista.
Adicione uma classe no diretório App_Code de seu projeto web, chamada “enumeracoes.vb”.
Imports Microsoft.VisualBasic
Public Class enumeracoes
''' <summary>
''' Enumeração de acesso
''' </summary>
''' <remarks></remarks>
Public Enum Permissao
[Diretor] = 2
[Gerente] = 3
[Analista] = 4
[Estagiario] = 5
[Visitante] = 6
[Administrador] = Diretor Or Gerente Or Analista Or Estagiario Or Visitante
End Enum
''' <summary>
''' Enumeração de animais
''' </summary>
''' <remarks></remarks>
Public Enum Animais
[Cachorro] = 1
[Gato] = 2
[Peixe] = 3
[Pássaro] = 4
[Outros] = 5
End Enum
''' <summary>
''' Quando queremos tratar enumerações
''' como bits
''' </summary>
''' <remarks></remarks>
<Flags()> Public Enum EstadoLed
[TudoApagado] = 0
[Aceso25PorCento] = 1
[Aceso50PorCento] = 2
[Aceso75PorCento] = 4
[Aceso100PorCento] = 8
End Enum
End ClassEnumeração em C# (como curiosidade)
public class enumeracoes
{
/// <summary>
/// Enumeração de acesso
/// </summary>
public enum Permissao
{
Diretor = 2,
Gerente = 3,
Analista = 4,
Estagiario = 5,
Visitante = 6,
Administrador = Diretor | Gerente | Analista | Estagiario | Visitante
}
/// <summary>
/// Enumeração de animais
/// </summary>
public enum Animais
{
Cachorro = 1,
Gato = 2,
Peixe = 3,
Pássaro = 4,
Outros = 5
}
/// <summary>
/// Quando queremos tratar enumerações
/// como bits
/// </summary>
[Flags()]
public enum EstadoLed
{
TudoApagado = 0,
Aceso25PorCento = 1,
Aceso50PorCento = 2,
Aceso75PorCento = 4,
Aceso100PorCento = 8
}
}Note que coloquei um exemplo de enumeração chamada EstadoLed. Esta enumeração possui uma marca de Flag. Isto significa que pode ser tratada como bits, com portência de 2 (1, 2, 4, 8…).
Agora que criamos a nossa classe com as enumerações do sistema, vamos ver como interagir facilmente com a tela.
Crie uma página chamada default.aspx, em seu projeto. (Prefira em utilizar “code behind”, ou seja, o código da página no arquivo default.aspx.vb). Na sua página default.aspx, copie o código.
<form id="form1" runat="server">
<div>
<fieldset>
<legend>Permissão de acesso </legend>
<asp:CheckBoxList ID="chkPermissao" runat="server">
</asp:CheckBoxList><br />
<asp:Button ID="btnMostrarValores" runat="server" Text="Mostrar Valores Selecionados" />
<br />
<br />
<asp:Label ID="lblValoresSelecionados" runat="server"></asp:Label>
</fieldset>
</div>
<br />
<fieldset>
<legend>Animais </legend>
<i>Selecione o tipo de animal abaixo.</i><br />
<asp:DropDownList ID="ddlAnimais" runat="server" AutoPostBack="true">
</asp:DropDownList><br />
<asp:Label runat="server" ID="lblSQLAnimais"></asp:Label>
</fieldset>
<br />
</form>Para trabalhar com a permissão, vamos criar o código abaixo.
#Region "Permissão"
''' <summary>
''' Método que carrega a permissão na checkbox
''' </summary>
Private Sub carregarPermissao()
Dim sPermissoesNomes As String() = System.[Enum].GetNames(GetType(enumeracoes.Permissao))
For Each sPermissao As String In sPermissoesNomes
' Para cara ítem na minha enumeração, eu adiciono na checkbox list
chkPermissao.Items.Add(New ListItem(sPermissao, Convert.ToString(sPermissao)))
Next
End Sub
''' <summary>
''' Método do botão Mostrar valores, que nos permite receber o que o usuário selecionou
''' </summary>
Protected Sub btnMostrarValores_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnMostrarValores.Click
Dim sValoresSelecionados As String = String.Empty
For Each oChkItem As ListItem In chkPermissao.Items
If oChkItem.Selected Then
Dim enumPermissao As New enumeracoes.Permissao
' Dou um parse no valor da checkbox, se selecionada, para poder exibir o valor
enumPermissao = System.Enum.Parse(GetType(enumeracoes.Permissao), oChkItem.Value)
sValoresSelecionados &= enumPermissao & " (" & enumPermissao.ToString & "); "
End If
Next
lblValoresSelecionados.Text = sValoresSelecionados
End Sub
#End RegionPara trabalhar com a enumeração de animais, vamos criar o código abaixo:
#Region "Animais"
''' <summary>
''' Método que carrega os animais, em uma combo
''' </summary>
Private Sub carregarAnimais()
Dim sAnimaisNomes As String() = System.[Enum].GetNames(GetType(enumeracoes.Animais))
Dim enumAnimal As New enumeracoes.Animais
For Each sAnimais As String In sAnimaisNomes
' Para cara ítem na minha enumeração, eu adiciono na combo
enumAnimal = System.Enum.Parse(GetType(enumeracoes.Animais), sAnimais)
ddlAnimais.Items.Add(New ListItem(sAnimais, enumAnimal))
Next
' adiciono um ítem de selecionar na combo.
ddlAnimais.Items.Insert(0, New ListItem("<--Selecione-->", "NaoSelecionado"))
End Sub
''' <summary>
''' evento que tratya a mudança de valor da dropdown
''' </summary>
Protected Sub ddlAnimais_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlAnimais.SelectedIndexChanged
Dim sSQL As String = String.Empty
Dim enumAnimal As New enumeracoes.Animais
If String.Compare(ddlAnimais.SelectedValue, "NaoSelecionado") = 0 Then
lblSQLAnimais.Text = "Selecione um animal"
Else
' Dou um parse no valor da combo (dropdown), se selecionada, para poder exibir o valor
enumAnimal = System.Enum.Parse(GetType(enumeracoes.Permissao), ddlAnimais.SelectedValue)
sSQL = "insert into tblanimais " & _
"(Tipo,Idade,Nome) values " & _
"('" & enumAnimal.ToString & "','14','Rufos')"
lblSQLAnimais.Text = "Sua SQL que você deve usar para salvar " & _
" no mySQL é: <br />"" <i>" & sSQL & "</i> """
End If
End Sub
#End RegionAgora só precisamos chamar os métodos no page load
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
' Chamo os métodos de carregar, se não for postback
carregarPermissao()
carregarAnimais()
End If
End SubConclusão
Neste artigo aprendemos a como trabalhar com enumeração, tanto em .Net quanto em MySQL. Vimos como ela pode nos auxiliar nos projetos do dia a dia. Além de ajudar a melhorar a performance, a enumeração nos ajuda a ter um código mais legível, de fácil manutenção e expansão.
Clique aqui para dar download no projeto de exemplo.
Forte Abraço!







