Você está na página 1de 34

VB .

NET - 7 passos para criar uma aplicao em 3


Camadas - Parte 1

O foco deste artigo explicar como criar uma aplicao em 3
camadas usando o Visual Basic .NET.(de novo)
Modelo em trs camadas, derivado do modelo em n camadas,
recebe esta denominao quando um sistema cliente-servidor
desenvolvido retirando-se a camada de negcio do lado do cliente. O
desenvolvimento mais demorado no incio comparando-se com o
modelo em duas camadas pois necessrio dar suporte a uma maior
quantidade de plataformas e ambientes diferentes. Em
contrapartida, o retorno vem em forma de respostas mais rpidas
nas requisies, excelente performance tanto em sistemas que
rodam na intranet ou internet e mais controle no crescimento do
sistema.
As trs partes de um ambiente modelo trs camadas so: camada de
apresentao, camada de negcio e camada de dados. Deve
funcionar de maneira que o software executado em cada camada
possa ser substitudo sem prejuzo para o sistema. De modo que
atualizaes e correes de defeitos podem ser feitas sem prejudicar
as demais camadas. Por exemplo: alteraes de interface podem ser
realizadas sem o comprometimento das informaes contidas no
banco de dados.
(Fonte:http://pt.wikipedia.org/wiki/Modelo_em_tr%C3%AAs_camad
as)
A figura abaixo procura mostrar de forma resumida esses 3
componentes identificando e nomeando cada um deles;

Podemos identificar as
seguintes camadas:
Camada de
Apresentao
(Presentation
Tier - UI)
Camada de
Negcios
(Business Logic
Tier - BLL)
Camada de
Acesso a dados
(Data Tier - DAL)
Obs: Na verdade a nossa soluo ter 4 camadas mas a camada de transferncia de dados
(DTO) ser considerada uma camada auxiliar onde iremos declarar as nossas classes POCO
usadas para transferir informaes sobre os objetos do nosso domnio.
A transferncia de dados de objeto (DTO), um padro de projeto
usado para transferir dados entre os subsistemas de aplicativos de
software. Os DTOs so muitas vezes utilizados em conjunto com os
objetos de acesso a dados para recuperar dados de um banco de
dados.
A diferena entre os objetos de transferncia de dados e objetos de
negcios ou objetos de acesso a dados que um DTO no tem
nenhum comportamento, exceto para armazenamento e recuperao
de seus prprios dados (acessores e modificadores)
Na prtica estaremos fazendo uma implementao do padro DAO
(Data Access Object) que define que toda a lgica de acesso aos
dados deve ser separada da lgica de apresentao e lgica do
negcio (regras da aplicao). A implementao dos DAOs muito
simples, para cada objeto DTO teremos um objeto DAO que ser
responsvel por realizar todas as operaes de persistncia deste
objeto na base de dados.
Existem diversas implementaes do padro DAO mas em geral podemos
relacionar algumas caractersticas desejveis em uma implementao do
padro DAO:
- Todo o acesso aos dados deve ser feita atravs das classes DAO de forma
a se ter o encapsulamento;
- Cada instncia da DAO responsvel por um objeto de domnio;
- O DAO deve ser responsvel pelas operaes CRUD no domnio;
- O DAO no deve ser responsvel por transaes , sesses ou conexes
que devem ser tratados fora do DAO;
O principais benefcios deste padro so:
Separao da lgica da persistncia da lgica de negcios;
Facilidade na manuteno;
Reduo da complexidade do cdigo da regra de negcios;
Centralizao de todo o acesso aos dados em uma camada
separada;
Vamos dividir esta tarefa em 7 etapas e explicar cada uma em
detalhes de forma que mesmo quem esta iniciando o seu aprendizado
no assunto possa acompanhar e entender o que foi feito.
Antes de iniciar a nossa caminhada (sero somente 7 passos) vamos
declarar os apetrechos necessrios para termin-la com xito :
Recursos necessrios para iniciar a
jornada:
1. Visual Basic 2010 Express Edition
2. Um banco de dados Relacional : SQL Server 2008
Express, MySQL, Oracle, etc. (e at o MS Access)
3. SQL Server Management Studio
Passo 1 - Criando um banco de dados
relacional e as tabelas usadas na aplicao
Vamos criar duas tabelas bem simples e um banco de dados no SQL Server
2008 Express Edition usando o SQL Server Management Studio.
Nota: Veja o artigo : Usando o SQL Server Management Studio -
Macoratti.net
Como eu estou usando a verso na qual apliquei o pacote de localizao voc
ver as mensagens, menus, etc em portugus.
Abra o SQL Server Management Studio(SSMS) e faa o login no seu SQL Server
Local (indicado como .\SQLEXPRESS);
Aps abrir o SSMS clique com o boto direito do mouse sobre o item Banco de
dados e selecione Novo Banco de dados...

Na janela - Novo Banco de dados - informe o nome Escola para o nome do
banco de dados e clique no boto OK;

Aps criar o banco de dados Escola clique com o boto direito sobre ele e
selecione Nova Tabela...

A seguir defina os campos id e nome nesta tabela sendo que o campo id
uma chave primria e do tipo identity. O nome da tabela Classe;

USE [Escola]
GO
CREATE TABLE
[dbo].[Classe](
[id] [int]
IDENTITY(1,1) NOT
NULL,
[nome] [varchar](50)
NULL,
CONSTRAINT
[PK_Classe] PRIMARY
KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX =
OFF,
STATISTICS_NORECO
MPUTE = OFF) ON
[PRIMARY]
) ON [PRIMARY]
GO
Acima temos a tabela Classe criada e ao lado o script para gerar a tabela na
janela de consultas do SSMS.
Agora vamos repetir o procedimento e criar a tabela Alunos com os
campos: id, nome e classeid, onde id um campo chave primria do
tipo identity:

USE [Escola]
CREATE TABLE
[dbo].[Alunos](
[id] [int]
IDENTITY(1,1) NOT
NULL,
[nome]
[nvarchar](50) NULL,
[classeid] [int] NULL,
CONSTRAINT
[PK_Alunos] PRIMARY
KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX =
OFF,
STATISTICS_NORECO
MPUTE = OFF) ON
[PRIMARY]
) ON [PRIMARY]

GO
Acima temos a tabela Alunos criada e ao lado o script para gerar a tabela:
Aps criar as tabelas vamos criar um diagrama das tabelas do banco de
dados Escola e definir o relacionamento entre o campo id da tabela Classe e o
campo classeid da tabela Alunos;
Na figura abaixo podemos notar que o relacionamento do tipo um-para-
muitos onde temos que uma classe pode conter muitos alunos:

Dessa forma j temos o banco de dados Escola , as tabelas Classe e Alunos e o
relacionamento entre as tabelas criados.
Obs: Podemos incluir alguns registros nas tabelas usando a instruo
INSERT INTO na janela de Consultas do SSMS.
INSERT INTO [Escola].[dbo].[Classe]
([nome])
VALUES
('Anlise Requisitos')
GO
INSERT INTO [Escola].[dbo].[Alunos]
([nome]
,[classeid])
VALUES
('Macoratti',1)
GO
Tabela Classe Tabela Alunos
Vamos ao segundo passo...
Nota: Dvidas com SQL ??? Veja o curso : Curso de SQL. -
Macoratti.net e a Seo SQL do Site Macoratti.net
Passo 2 - Criando a soluo no Visual
Basic 2010 Express Edition
No segundo passo vamos criar um novo projeto usando o Visual Basic 2010
Express Edition.
Vamos criar uma soluo contendo 3 projetos onde cada projeto representar
uma camada da nossa aplicao. Assim teremos:
1. Soluo - AppTresCamadas
2. Projeto Windows Forms - Camada de Apresentao - CamadaWin
3. Projeto Class Library - Camada de Negcios - CamadaBLL
4. Projeto Class Library - Camda de Acesso aos Dados - CamadaDAL
No menu File clique em New Project e selecione o template Windows Forms
Application informando o nome CamadaWin;
No menu File clique em Save All e na janela Save Project informe o
nome AppTresCamadas para o nome da soluo e clique em Save;

Vamos agora incluir a camada de negcios:
No menu File clique em Add e a seguir em New Project e selecione o
template Class Library informando o nome CamadaBLL e clicando
em OK;

Agora vamos incluir a camada de acesso aos dados:
No menu File clique em Add e a seguir em New Project e selecione o
template Class Library informando o nome CamadaDAL e clicando
em OK;
Definindo a camada DTO.
Finalmente vamos incluir uma camada onde vamos definir as classes
do nosso domnio. Essa camada ser uma camada de transferncia
que dever ser enxergada pelos demais projetos.
No menu File clique em Add e a seguir em New Project e selecione o
template Class Library informando o nome CamadaDTO e clicando
em OK;
Ao final desta etapa na janela Solution Explorer deveremos ter a
estrutura conforme exibe a figura abaixo:

Passo 3 - Definindo as dependncias e
referncias entre os projetos da soluo
Neste passo temos que definir as dependncias entre os 4 projetos
criados na soluo.
Em nossa soluo teremos as seguintes dependncias:
1. A camada de apresentao - projeto CamadaWin - dever
possuir uma dependncia para o projeto CamadaBLL que a
nossa camada de negcios;
2. A camada de negcios - projeto CamadaBLL - dever possuir
uma dependncia para o projeto CamadaDAL que nossa
camada de acesso aos dados;
3. A camada de transferncia de dados - DTO - Data Transfer
Object - que dever ser visto pelos demais projetos;
Assim teremos a seguinte hierarquia: CamadaWin (CamadaDTO) =>
CamadaBLL (CamadaDTO) => CamadaDAL => CamadaDTO
Dessa forma a camada de apresentao dever enxergar a camada de
negcios que por sua vez dever enxergar a camada de acesso a
dados.
Clique com o boto direito sobre o nome da soluo e
selecione Properties ou tecle ALT+ENTER;
Na janela de propriedades selecione o item - Project Dependencies ;
A seguir na combo Project selecione o projeto CamadaWin e na
janela Depends on: marque CamadaBLL e CamadaDTO:

Repita o procedimento anterior selecionando na combo Project o
projeto CamadaBLL e na janela Depends on: marque CamadaDAL e
CamadaDTO:

Repita o procedimento anterior selecionando na combo Project o
projeto CamadaDAL e na janela Depends on: marque CamadaDTO:

Para concluir esse passo temos definir o projeto que dever ser
executado quando a aplicao for iniciada.
Na nossa soluo queremos que o projeto Windows Forms (camada de
apresentao) seja o projeto executado quando a soluo inicie:
Nas janela de propriedades da soluo clique no item Startup
Project e selecione Single Startup project escolhendo o
projeto CamadaWin e clicando no boto OK:

Aps definir estas dependncias temos que incluir as referncias
entre os projetos da nossa soluo.
Na janela Solution Explorer clique com o boto direito do mouse
sobre o projeto CamadaDAL e clique em Add Reference;
A seguir selecione a guia Projects e selecione o
projeto CamadaDAL e o projeto CamadaDTO e clique em OK;

Repita o procedimento acima para o
projeto CamadaDAL referenciando o projeto CamadaDTO;

Faa o mesmo para o projeto CamadaWin referenciando os
projetos CamadaBLL e CamadaDTO:

Vamos agora descansar um pouco da nossa caminhada, afinal demos 3
longos passos, e temos que recuperar as foras para prosseguir...
Na primeira parte deste artigo demos os primeiros passos em nossa
caminhada cujo objetivo criar uma aplicao em camadas usando o
VB .NET.
Iremos agora iniciar a definio de cada uma das camadas da nossa
aplicao comeando pela camada DTO que deve estar acessvel a
todas as camadas da soluo e funciona como uma camada de
transferncia de objetos entre as demais camadas.
Passo 4 - Definindo as classes do nosso
domnio na camada DTO - Data Transfer Object
No nosso modelo de desenvolvimento estamos partindo do banco de dados,
onde j definimos as tabelas Classe e Alunos, e agora deveremos criar as
classes que representam o nosso domnio.
Nosso modelo nos leva a criar as entidades Classe e Aluno que so classes que
devero representar as tabelas Classe e Alunos.
Vamos ento definir as classes e nestas classes vamos definir os membros que
representam os campos das respectivas tabelas.
1- Criando a classe Classe no projeto CamadaDTO
Clique com o boto direito do mouse sobre o projeto CamadaDTO e
selecione Add->Class;
Selecione o template Class e informe o nome Classe.vb e clique no
boto Add;
A seguir vamos definir o cdigo abaixo nesta classe:
Public Class Classe
Private _id As Integer
Private _nome As String
Private _acao As Byte
Public Property ClasseId()
As String
Get
Return _id
End Get
Set(ByVal value As
String)
_id = value
End Set
End Property
Public Property
NomeClasse() As String
Get
Return _nome
End Get
Set(ByVal value As
String)
_nome = value
End Set
End Property
Public Property Acao() As
Byte
Get
Return _acao
End Get
Set(ByVal value As
Byte)
_acao = value
End Set
End Property
End Class
A classe Classe possui os membros _id , _nome e _acao e
as propriedades:
- ClasseID
- NomeClasse
- Acao
Onde ClasseID representa o campo id da tabela Classe e a
propriedade
NomeClasse representa o campo nome da tabela Classe
A propriedade Acao representa a ao que pretendemos
realizar na tabela e
que poder ser: inserir, atualizar, deletar e sem ao
A propriedade Acao foi definida na classe apenas para
mostrar que podemos
definir outras propriedades alm daquelas que
representam os campos da tabela.
2- Criando a classe Aluno no projeto CamadaDTO
Clique com o boto direito do mouse sobre o projeto CamadaDTO e
selecione Add->Class;
Selecione o template Class e informe o nome Aluno.vb e clique no boto Add;
A seguir vamos definir o cdigo abaixo nesta classe:
Public Class Aluno
Private _id As Integer
Private _nome As String
Private _classeid As
Integer
Private _acao As Byte
Public Property AlunoId()
As Integer
Get
Return _id
End Get
Set(ByVal value As
Integer)
_id = value
End Set
End Property
Public Property
NomeAluno() As String
Get
Return _nome
End Get
Set(ByVal value As
String)
_nome = value
End Set
End Property
Public Property ClasseId
As Integer
Get
Return _classeid
End Get
Set(ByVal value As
Integer)
_classeid = value
End Set
End Property
Public Property Acao() As
Byte
Get
Return _acao
End Get
Set(ByVal value As
Byte)
_acao = value
End Set
End Property
End Class
A classe Aluno possui os membros _id , _nome, classeid e
_acao e as propriedades:
- AlunoID
- NomeAluno
- ClasseId
- Acao
Onde AlunoID representa o campo id da tabela Aluno, a
propriedade
NomeAluno representa o campo nome da tabela Aluno e o
campo ClasseId representa
o campo classeid da tabela Aluno que uma chave estrangeira.
A propriedade Acao representa a ao que pretendemos realizar
na tabela e
que poder ser: inserir, atualizar, deletar e sem ao
A propriedade Acao foi definida na classe apenas para mostrar
que podemos
definir outras propriedades alm daquelas que representam os
campos da tabela.
Obs: Estou usando a sintaxe antiga para definir as propriedades.
A nova sintaxe simplifica
e facilita a leitura do cdigo. Ex: Para a classe Aluno o cdigo
ficaria assim:
Public Property AlunoId As Integer
Public Property NomeAluno As String
Public Property ClasseId as Integer
Public Property Acao as Byte
A camada DTO tem como responsabilidade a transferncia das
informaes sobre os objetos Classe e Aluno entre as demais
camadas. Lembrando que um DTO no tem nenhum comportamento,
exceto para armazenamento e recuperao de seus prprios dados
(acessores e modificadores).
Passo 5 - Definindo a camada de acesso
a dados - CamadaDAL
A camada de acesso a dados responsvel pelo acesso e a
persistncia dos dados e nesta camada vamos definir as classes que
contm os mtodos genricos para acessar e persistir dados e as
classes especficas relacionadas com as classes do nosso domnio.
Assim teremos as seguintes classes nesta camada:
AcessoDados - Classe genrica que contm os mtodos para
acesso e persistncia de dados;
ClasseDAL - Classe contm os mtodos para acesso e
persistncia das informaes sobre a entidade Classe;
AlunosDAL - Classe contm os mtodos para acesso e
persistncia das informaes sobre a entidade Aluno;
Alm destas classes a camada de acesso a dados dever possuir
tambm um arquivo de configurao app.Config onde iremos
armazenar a string de conexo e um mdulo
chamado GlobalDAL.vb que conter uma enumerao definindo as
aes que poderemos fazer em nossas entidades.
1- Criando o arquivo de configurao app.config
Clique com o boto direito do mouse sobre o projeto CamadaDAL e
selecione Add -> New Item;
A seguir selecione o template Application Configuration File e
aceite o nome app.config e clique em Add;
A seguir defina neste arquivo entre as tags <configuration> a
tag <connectionStrings> contendo a string de conexo com o nosso
banco de dados Escola conforme abaixo:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
.......
<connectionStrings>
<add name="ConexaoSQLServer" connectionString="Data Source=.\SQLEXPRESS;Initial
Catalog=Escola;Persist Security Info=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>

</configuration>
2- Criando o mdulo GlobalDAL.vb
Clique com o boto direito do mouse sobre o projeto CamadaDAL e
selecione Add -> Module;
A seguir selecione o template Module e informe o
nome GlobalDAL.vb;
A seguir defina neste arquivo o seguinte cdigo:
Module GlobalDAL
Public Enum FlagAcao
Insert = 1
Update = 2
Delete = 3
NoAction = 0
End Enum
End Module
3- Criando as classes AcessoDados, AlunosDAL e ClasseDAL
a- Criando a classe genrica AcessoDados (SQLHelp)
Clique com o boto direito do mouse sobre o projeto CamadaDAL e
selecione Add -> Class;
A seguir selecione o template Class e informe o
nome AcessoDados.vb;
A seguir defina neste arquivo o seguinte cdigo:
Imports System.Configuration
Imports System.Data.SqlClient

Public Class AcessoDados

Dim conn As SqlConnection
Dim cmd As SqlCommand
Dim isTran As Boolean
Private trans As SqlTransaction
Dim connStr As String

Public Shared Function GetConnectionString(ByVal
strConnection As String) As String
Dim retorno As New String("")
If Not String.IsNullOrEmpty(strConnection) Then
Try
retorno =
ConfigurationManager.ConnectionStrings(strConnection).Connec
tionString
Catch ex As Exception
MsgBox(ex.Message)
Nesta classe temos definidos
os seguintes mtodos:
GetConnectionString
- obtm a string de
conexo do arquivo
app.config;
Connect - Abre uma
conexo com o banco
de dados SQL Server;
CloseConn - fecha a
conexo aberta;
ExecuteQuery -
Executa um comando
SQL e retorna um
boleano;
ExecuteAndGetRead
er - Executa um
comando SQL e
retorna um
SqlDataReader;
End Try
Else
retorno =
ConfigurationManager.ConnectionStrings("ConexaoSQLServer").C
onnectionString
End If
Return retorno
End Function

Private Function Connect() As Boolean
Dim connstr As String
Dim bln As Boolean
'Try
If conn Is Nothing Then
connstr = GetConnectionString("ConexaoSQLServer")
If connstr <> String.Empty Then
bln = True
conn = New SqlConnection(connstr)
Else
bln = False
End If
End If
If conn.State = ConnectionState.Closed Then
Try
conn.Open()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
Return bln
End Function

Public Sub CloseConn()
If Not conn Is Nothing Then
If Not conn.State = ConnectionState.Closed Then
conn.Close()
End If
End If
End Sub

Public Function ExecuteQuery(ByVal strCmdTxt As String) As
Boolean
Dim intRows As Integer

If conn.State = ConnectionState.Closed Then
Connect()
End If

cmd = New SqlCommand
cmd.Connection = conn
cmd.CommandText = strCmdTxt
cmd.CommandType = CommandType.Text

If Not isTran Then
intRows = cmd.ExecuteNonQuery()
conn.Close()
Else
cmd.Transaction = trans
intRows = cmd.ExecuteNonQuery()
Sub New()
(Construtor) - O
construtor da classe;
chama o mtodo
Connect;
BeginTransaction -
Inicia uma transao;
CommitTransaction -
Faz um commit na
transao;
RollBackTransaction
- Cancela a
transao;
Os mtodos definidos nesta
classe so de uso geral e
sero usados para acessar o
banco de dados
SQL Server e realizar a
persistncia dos dados;
Procurei manter este arquivo
o mais simples possvel mas
ele pode ser melhorado com
outras opes.
End If
If intRows > 0 Then
ExecuteQuery = True
Else
ExecuteQuery = False
End If
End Function

Public Function ExecuteAndGetReader(ByVal strCmdTxt As
String) As SqlDataReader
If conn.State = ConnectionState.Closed Then
Connect()
End If

cmd = New SqlCommand
cmd.Connection = conn
cmd.CommandText = strCmdTxt
cmd.CommandType = CommandType.Text

If Not isTran Then
ExecuteAndGetReader = cmd.ExecuteReader
Else
cmd.Transaction = trans
ExecuteAndGetReader = cmd.ExecuteReader
End If
End Function

Public Sub New()
If Not Connect() Then
Exit Sub
End If
End Sub
Public Sub BeginTransaction()
If isTran Then Return
If conn.State = ConnectionState.Closed Then
conn.Open()
End If
trans = conn.BeginTransaction()
isTran = True
End Sub
Public Sub CommitTransaction()
If Not isTran Then Return
trans.Commit()
conn.Close()
trans = Nothing
isTran = False
End Sub
Public Sub RollBackTransaction()
If Not isTran Then Return
trans.Rollback()
conn.Close()
trans = Nothing
isTran = False
End Sub
End Class
b- Criando a classe AlunosDAL com mtodos especficos acessar e
persitir dados de um objeto do tipo Aluno
Clique com o boto direito do mouse sobre o projeto CamadaDAL e
selecione Add -> Class;
A seguir selecione o template Class e informe o nome AlunosDAL.vb;
A seguir defina neste arquivo o seguinte cdigo:
Imports System.Data.SqlClient
Imports CamadaDTO
Imports System.Collections.Generic

Public Class AlunosDAL
Public Function DeletaAlunoPorId(ByVal _alunoId As Integer) As Boolean
Dim strSql As String
Dim objDB As AcessoDados
strSql = "Delete from Alunos where id=" & _alunoId
objDB = New AcessoDados
objDB.ExecuteQuery(strSql)
Return True
End Function

Public Function GetAlunos() As List(Of Aluno)
Dim objdb As New AcessoDados
Dim strSql As String = ""
strSql = "Select * from Alunos"
Dim dr As SqlDataReader = objdb.ExecuteAndGetReader(strSql)
Dim lista As New List(Of Aluno)
While dr.Read
Dim alu As Aluno = New Aluno
alu.ClasseId = IIf(IsDBNull(dr("classeid")), 0, dr("classeid"))
alu.AlunoId = IIf(IsDBNull(dr("id")), 0, dr("id"))
alu.NomeAluno = IIf(IsDBNull(dr("nome")), "", dr("nome"))
lista.Add(alu)
End While
dr.Close()
Return lista
End Function

Public Function GetAlunoPorId(ByVal alunoid As Integer) As Aluno
Dim objdb As New AcessoDados
Dim strSql As String = ""
Dim alu As Aluno = Nothing
strSql = "Select * from Alunos where id= " & alunoid
Dim dr As SqlDataReader = objdb.ExecuteAndGetReader(strSql)
While dr.Read
alu = New Aluno
alu.ClasseId = IIf(IsDBNull(dr("classeid")), 0, dr("classeid"))
alu.AlunoId = IIf(IsDBNull(dr("id")), 0, dr("id"))
alu.NomeAluno = IIf(IsDBNull(dr("nome")), "", dr("nome"))
End While
dr.Close()
Return alu
End Function

Public Function GetAlunosPorClasse(ByVal classeid As Integer) As List(Of Aluno)
Dim objdb As New AcessoDados
Dim strSql As String = ""
strSql = "Select * from Alunos where classeid= " & classeid
Dim dr As SqlDataReader = objdb.ExecuteAndGetReader(strSql)
Dim lista As New List(Of Aluno)
Dim alu As Aluno = Nothing
While dr.Read
alu = New Aluno
alu.ClasseId = IIf(IsDBNull(dr("classeid")), 0, dr("classeid"))
alu.AlunoId = IIf(IsDBNull(dr("id")), 0, dr("id"))
alu.NomeAluno = IIf(IsDBNull(dr("nome")), "", dr("nome"))
lista.Add(alu)
End While
dr.Close()
Return lista
End Function

Public Function SalvaAluno(ByVal _aluno As Aluno) As Boolean
Dim strsql As String = ""
Dim objDB As New AcessoDados
If _aluno.Acao = FlagAcao.Insert Then
strsql = "Insert into Alunos (nome,classeid) " & "values( '" &
_aluno.NomeAluno.Trim() & "', " & _aluno.ClasseId & ")"
ElseIf _aluno.Acao = FlagAcao.Update Then
strsql = "Update Alunos set" & "nome='" & _aluno.NomeAluno & "'," &
" classeid=" & _aluno.ClasseId & "' " & " where id=" & _aluno.AlunoId
End If
objDB.ExecuteQuery(strsql)
Return True
End Function
End Class
Nesta classe criamos os mtodos:
DeletaAlunoPorId - exclui um aluno da tabela
GetAlunos - Obtm todos os alunos
GetAlunoPorId - Obtm um aluno pelo seu cdigo
GetAlunosPorClasse - Obtm os alunos de uma classe
SalvaAluno - Salva os dados de um aluno
c- Criando a classe ClasseDAL com mtodos especficos acessar e
persitir dados de um objeto do tipo Classe
Clique com o boto direito do mouse sobre o projeto CamadaDAL e
selecione Add -> Class;
A seguir selecione o template Class e informe o nome ClasseDAL.vb;
A seguir defina neste arquivo o seguinte cdigo:
Imports System.Data.SqlClient
Imports CamadaDTO
Imports System.Collections.Generic

Public Class ClasseDAL
Public Function DeletaClasse(ByVal ClasseID As Integer) As Boolean
Dim strSql As String
Dim objdb As New AcessoDados
Try
strSql = "Delete from Alunos where id= " & ClasseID
objdb.ExecuteQuery(strSql)
objdb = New AcessoDados
strSql = "Delete from Classe where id= " & ClasseID
objdb.ExecuteQuery(strSql)
Catch ex As Exception
Throw New Exception
End Try
Return True
End Function

Public Function GetClasses() As List(Of Classe)
Dim strSql As String
Dim objdb As New AcessoDados
Dim lista As New List(Of Classe)
strSql = "Select * from Classe"
Dim dr As SqlDataReader = objdb.ExecuteAndGetReader(strSql)
While dr.Read
Dim cls As Classe = New Classe
cls.ClasseId = IIf(IsDBNull(dr("id")), 0, dr("id"))
cls.NomeClasse = IIf(IsDBNull(dr("nome")), "", dr("nome"))
lista.Add(cls)
End While
dr.Close()
Return lista
End Function

Public Function GetClassePorId(ByVal Id As Integer) As Classe
Dim strSql As String
Dim objdb As New AcessoDados
Dim cls As Classe = Nothing
strSql = "Select * from Classe where id= " & Id
Dim dr As SqlDataReader = objdb.ExecuteAndGetReader(strSql)
Dim arr As New ArrayList
While dr.Read
cls = New Classe
cls.ClasseId = IIf(IsDBNull(dr("id")), 0, dr("id"))
cls.NomeClasse = IIf(IsDBNull(dr("nome")), "", dr("nome"))
End While
dr.Close()
Return cls
End Function

Public Function Salva(ByVal cls As Classe) As Boolean
Dim strsql As String = String.Empty
Dim objDB As New AcessoDados
If cls.Acao = FlagAcao.Insert Then
strsql = "Insert into Classe (nome) values( '" & cls.NomeClasse.Trim()
& "')"
ElseIf cls.Acao = FlagAcao.Update Then
strsql = "Update Classe set nome='" & cls.NomeClasse.Trim() & "'" & "
where id=" & cls.ClasseId
Else
Return False
End If
Try
objDB.ExecuteQuery(strsql)
Catch ex As Exception
Throw New Exception
End Try
Return True
End Function
End Class
Nesta classe criamos os mtodos:
DeletaClasse - Deleta uma classe
GetClasses - Obtm todas a classes
GetClassePorId - Obtm uma classe pelo seu cdigo
Salva - Salva os dados de uma classe
Nos mtodos das classes AlunosDAL e ClasseDAL estamos usando
instrues SQL como texto no cdigo. Uma melhor opo seria a
utilizao de stored procedures por serem mais seguras e mais
rpidas.
Na segunda parte deste artigo iniciamos a definio das camadas da
nossa soluo iniciando com a camada DTO e a camada de acesso a
dados. Continuando a nossa caminhada cujo objetivo criar uma
aplicao em camadas usando o VB .NET.
Iremos agora continuar a definio das camadas da nossa aplicao
desta vez abordando a camada de negcios - CamadaBLL - que
responsvel pelas regras de negcio do nosso domnio e onde iremos
efetuar as validaes.
O objetivo da camada de negcios implementar a lgica da
aplicao, expondo esta lgica para a camada de apresentao e
outras aplicaes, e tambm acessar a camada de acesso a dados.
Passo 6 - Definindo as classes do nosso
domnio na camada de negcio - CamadaBLL
Como ja escrevi nosso modelo muito simples e estamos usando o padro
DAO para implementar as funcionalidades da nossa soluo. Nada muito
sofisticado mas funcional seguindo o padro KISS - Keept Simple Stupid. (
um princpio que defende que toda a complicao desnecessria
deve ser evitada. Ento se o jeito simples o certo, por que
complicamos ? Por pura falta de competncia e preguia.
Simples no sinnimo de fcil.)
Seguindo este padro vamos agora criar as classes da camada de negcio -
CamadaBLL - onde para cada classe do nosso domnio teremos uma classe de
negcio relacionada.
Vamos ento definir as classes e nestas classes vamos definir os mtodos que
acessam a camada de acesso a dados. Eu no estou realizando nenhuma
validao nesta camada para deixar o exemplo mais limpo e fcil de entender
mas qualquer validao de negcio dever ser feita nesta camada.
1- Criando a classe ClasseBLL
Clique com o boto direito do mouse sobre o projeto CamadaBLL e
selecione Add->Class;
Selecione o template Class e informe o nome ClasseBLL.vb e clique no
boto Add;
A seguir vamos definir o cdigo abaixo nesta classe:
Imports CamadaDTO
Imports CamadaDAL
Public Class ClasseBLL
Public Function GetTodasClasses() As List(Of
Classe)
Dim db As New ClasseDAL
Return db.GetClasses()
End Function
Public Function GetClassePorCodigo(ByVal
_CodigoClasse As Integer) As Classe
Dim db As New ClasseDAL
Return db.GetClassePorId(_CodigoClasse)
End Function
Public Function Salvar(ByVal cls As Classe)
Dim db As New ClasseDAL
Return db.Salva(cls)
End Function
Public Function DeletarClasse(ByVal
_CodigoClasse As Integer)
Dim db As New ClasseDAL
Return db.DeletaClasse(_CodigoClasse)
End Function
End Class
A classe ClasseBLL possui os mtodos:
GetTodasClasses
GetClassePorCodigo
Salvar
DeletarClasse
Esta classe esta apenas usando os mtodos
criados para
acessar os mtodos correspondentes na
camada CamadaDAL
2- Criando a classe AlunosBLL
Clique com o boto direito do mouse sobre o projeto CamadaBLL e
selecione Add->Class;
Selecione o template Class e informe o nome AlunosBLL.vb e clique no
boto Add;
A seguir vamos definir o cdigo abaixo nesta classe:
Imports CamadaDTO
Imports CamadaDAL
Public Class AlunosBLL
Public Function GetTodosAlunos() As List(Of
Aluno)
Dim db As New AlunosDAL
Return db.GetAlunos
End Function
Public Function GetAlunosPorCodigo(ByVal
_alunoId As Integer) As Aluno
Dim db As New AlunosDAL
Return db.GetAlunoPorId(_alunoId)
End Function
Public Function GetAlunosPorClasse(ByVal
_classeId As Integer)
Dim db As New AlunosDAL
Return db.GetAlunosPorClasse(_classeId)
End Function
Public Function SalvaAluno(ByVal _aluno As
Aluno)
Dim db As New AlunosDAL
Return db.SalvaAluno(_aluno)
End Function
Public Function DeletaAluno(ByVal _alunoId
As Integer)
Dim db As New AlunosDAL
Return db.DeletaAlunoPorId(_alunoId)
End Function
End Class
A classe AlunosBLL possui os mtodos:
GetTodosAlunos
GetAlunosPorCodigo
GetAlunosPorClasse
SalvaAluno
DeletaAluno
Esta classe esta apenas usando os mtodos
criados para
acessar os mtodos correspondentes na
camada CamadaDAL
As duas classes definidas nesta camada atuam da mesma forma
criando uma instncia da camada de acesso a dados e usando o
mtodo definido para realizao da operao.
As validaes de negcio devem ser realizadas nesta camada. Isso
no esta sendo feito neste exemplo pela simplicidade do projeto.
Passo 7 - Definindo a camada de
apresentao - CamadaWin
Vamos agora definir a camada de apresentao onde criaremos um
projeto Windows Forms para permitir que o usurio gerencie as
classes e os alunos realizando as seguintes operaes:
Cadastrar Classe
Alterar Classe
Cadastrar Aluno
Meu objetivo ser mostrar que na camada de apresentao
deveremos tratar apenas da apresentao e tratamento das
informaes pois a lgica do negcio e a persistncia dos dados esto
em camadas separadas. Dessa forma a camada de apresentao no
deve saber nada sobre lgica de negcios nem sobre persistncia de
dados.
A camada de apresentao para atualizar as informaes ir usar os
servios da camada de acesso aos dados via camada de negcios,
realizando nesta as validaes pertinentes.
No formulrio form1.vb que foi criado por padro vamos definir o
leiaute conforme mostra a figura abaixo:

Controles principais do
formulrio:
GroupBox - grpNovaClasse -
Text = Classes
CboClasses
txtNovaClasse
btnNovaClasse
btnSalvarClasse
GroupBox - grpAlunos - Text
= Alunos
dgvAlunos
txtNovoAluno
bntSair
btnSalvarAluno
ErrorProvider -
ErrorProvider1


Vamos declarar a utilizao dos namespaces
Imports CamadaDTO
Imports CamadaBLL
Isso necessrio pois precisamos acessar os mtodos da camada de
negcios e os objetos na camada DTO.
Precisamos definir uma enumerao para declarar qual a ao que
desejamos realizar. A seguir temos a enumerao FlagAcao que
define 3 tipos de operao: Insert, Update, Delete e NoAction:
Public Enum FlagAction
Insert = 1
Update = 2
Delete = 3
NoAction = 0
End Enum
No formulrio vamos declarar as variveis para tratar as classes Aluno e
Classe:
Private _alunos As List(Of Aluno)
Private _aluno As Aluno
Private _classe As Classe
Private _classes As List(Of Classe)
Esses objetos permitiro acessar e obter informaes sobre alunos e
classes.
No evento Load do formulrio form1.vb vamos carregar a
combobox cboClasses e o DataGridView dgvAlunos com as
informaes das classes e alunos:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
carregaCombo()
carregaGrid(cboClasses.SelectedValue)
End Sub
O cdigo do procedimento carregaCombo() o seguinte:
Sub carregaCombo()
Dim clsBLL As New ClasseBLL
_classes = clsBLL.GetTodasClasses
With cboClasses
.DataSource = _classes
.DisplayMember = "NomeClasse"
.ValueMember = "ClasseId"
End With
End Sub
O cdigo acessa o mtodo GetTodasClasses da camada de negcios e
preenche o combobox com as classes.
O cdigo do procedimento carregaGrid() o seguinte:
Sub carregaGrid(ByVal classeID As Integer)
Dim alnBLL As New AlunosBLL
_alunos = alnBLL.GetAlunosPorClasse(classeID)
With dgvAlunos

.DataSource = _alunos
.ColumnHeadersVisible = True

.ColumnHeadersDefaultCellStyle.ForeColor = Color.BurlyWood
.Columns.Item("ClasseId").Visible = False
.Columns.Item("AlunoId").HeaderText = "Codigo do Aluno"
.Columns.Item("NomeAluno").HeaderText = "Nome do Aluno"
.Columns.Item("Acao").Visible = False
End With
End Sub
O cdigo acessa o mtodo GetAlunosPorClasse() passando o cdigo
da classe e forma a obter e exibir os alunos de acordo com a classe
selecionada.
No evento SelectedIndexChanged da combobox cboClasses temos o
cdigo que obtm as classes e conforme a alterao da classe
selecionada carrega e atualiza o datagridview com os alunos
pertencentes classe selecionada:
Private Sub cboClasses_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cboClasses.SelectedIndexChanged
If cboClasses.SelectedIndex = -1 Then Exit Sub
Dim cls As Classe
Dim clsBLL As New ClasseBLL
cls = clsBLL.GetClassePorCodigo(cboClasses.SelectedIndex + 1)
If Not IsNothing(cls) Then
carregaGrid(cls.ClasseId)
Me.txtNovaClasse.Text = cls.NomeClasse
End If
End Sub
No evento Click do boto nova classe apenas preparamos a interface
para incluir uma nova classe ou cancelar a operao:
Private Sub btnNovaClasse_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnNovaClasse.Click

If btnNovaClasse.Text = "Nova Classe" Then
btnNovaClasse.Text = "Cancelar"
btnSalvarClasse.Enabled = True
Me.txtNovaClasse.Text = ""
Me.cboClasses.SelectedIndex = -1

grpNovaClasse.Text = "Informe uma nova Classe"
grpNovaClasse.BackColor = Color.MintCream
grpAlunos.Visible = True
grpAlunos.Enabled = False

Me.txtNovaClasse.Focus()
ElseIf btnNovaClasse.Text = "Cancelar" Then
grpNovaClasse.BackColor = Color.Pink
grpAlunos.Visible = True
grpAlunos.Enabled = True
btnNovaClasse.Text = "Nova Classe"
End If
End Sub
No evento Click do boto Salvar chamamos o
procedimento SalvarClasse():
Private Sub btnSalvarClasse_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnSalvarClasse.Click
SalvarClasse()
End Sub
O procedimento SalvarClasse() realizar a incluso de uma nova classe
ou atualizao de uma classe existente:
Sub SalvarClasse()

Dim bln As Boolean
Dim clsBLL As New ClasseBLL
Dim cls As New Classe

If txtNovaClasse.Text = String.Empty Or txtNovaClasse.Text.Length < 5 Then
MsgBox("Informe o nome da nova classe (minmo 5 caracteres).")
txtNovaClasse.Focus()
Return
End If

cls.NomeClasse = Me.txtNovaClasse.Text.Trim

If cboClasses.SelectedIndex = -1 Then
cls.Acao = FlagAcao.Insert
Else
cls.ClasseId = cboClasses.SelectedValue
cls.Acao = FlagAcao.Update
End If

bln = clsBLL.Salvar(cls)

If bln Then
MessageBox.Show("Dados Atualizados com sucesso !")
If cboClasses.SelectedIndex = -1 Then
carregaCombo()
cboClasses.SelectedIndex = 0
End If
Refresh(cboClasses.SelectedIndex)
grpNovaClasse.Visible = True
grpAlunos.Enabled = True
btnSalvarClasse.Enabled = False
Else
MessageBox.Show("Ocorreu um erro ao atualizar os dados !!")
btnSalvarClasse.Enabled = False
End If
End Sub
No cdigo do evento Click do boto Salvar (grpAlunos) verificamos se
existe uma classe selecionada e um nome de aluno informado para
chamar o procedimentoSalvarAluno():
Private Sub btnSalvarAluno_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnSalvarAluno.Click
ErrorProvider1.Clear()
If cboClasses.SelectedIndex = -1 Then
ErrorProvider1.SetError(Me.cboClasses, "Selecione uma Classe!!")
Exit Sub
End If
If Me.txtNovoAluno.Text.Trim() = "" Then
ErrorProvider1.SetError(Me.txtNovoAluno, "Informe o nome do Aluno !!")
Exit Sub
End If
SalvarAluno()
End Sub
O procedimento SalvarAluno() obtm a classe e o nome do aluno,
define a ao e chama o mtodo SalvaAluno() passando o objeto
Aluno para persistncia dos dados:
Sub SalvarAluno()
Dim alnBLL As New AlunosBLL
Dim aln As New Aluno
Dim cls As New Classe
Dim clsBLL As New ClasseBLL
Try
'obtem a classe selecionada
cls = clsBLL.GetClassePorCodigo(cboClasses.SelectedIndex + 1)
'obtem o id da classe
aln.ClasseId = cls.ClasseId
'obtem o nome do aluno
aln.NomeAluno = Me.txtNovoAluno.Text
'define a ao
aln.Acao = FlagAcao.Insert
'usa o mtodo para salvar o aluno
alnBLL.SalvaAluno(aln)
MessageBox.Show("Dados do aluno atualizado com sucesso !!")
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Estamos sobrescrevendo o mtodo Refresh do formulrio onde
atualizamos o controle combobox cboClasses conforme abaixo:
Public Overloads Sub Refresh(ByVal intID As Integer)

cboClasses.DataSource = _classes
cboClasses.Refresh()
cboClasses.SelectedIndex = intID

End Sub
Finalmente o evento CLick do boto Sair encerra a aplicao:
Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnSair.Click
Application.Exit()
End Sub
Como podemos observar nossa camada de apresentao no utiliza
nem usa nenhuma referncia para realizar a persistncia, ao invs
disso ela usa os mtodos da camada de negcios para realizar tais
operaes. Assim qualquer mudana na camada de acesso a dados
no afeta diretamente nossa camada de apresentao.
O exemplo da camada de apresentao no esta completo e foi usado
apenas para ilustrar a separao das responsabilidades em camadas.
Assim completamos a nossa caminhada em 7 passos onde percorremos
as etapas bsicas onde em cada passo abordamos os conceitos
relacionados com a separao de responsabilidades e a criao de
camadas.