Na primeira parte deste artigo demos os primeiros passos em nossa caminhada, cujo objetivo é criar uma aplicação em camadas usando o VB .NET. Iremos, agora, iniciar a definição de cada uma das camadas da nossa aplicação começando pela camada DTO, que deve estar acessível a todas as camadas da solução e funciona como uma camada de transferência de objetos entre as demais camadas.
Passo 4. Definindo as classes do nosso domínio 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 domínio.
Nosso modelo nos leva a criar as entidades Classe e Aluno que são classes que deverão representar as tabelas Classe e Alunos. Vamos, então, definir as classes e nelas vamos definir os membros que representam os campos das respectivas tabelas.
1. Criando a classe Classe no projeto CamadaDTO
Clique com o botão direito do mouse sobre o projeto CamadaDTO e selecione Add->Class e depois selecione o template Class e informe o nome Classe.vb e clique no botão Add. A seguir vamos definir o código 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 ação que pretendemos realizar na tabela e que poderá ser: inserir, atualizar, deletar e sem ação. A propriedade Acao foi definida na classe apenas para mostrar que podemos definir outras propriedades além daquelas que representam os campos da tabela.
2. Criando a classe Aluno no projeto CamadaDTO
Clique com o botão direito do mouse sobre o projeto CamadaDTO e selecione Add->Class. Selecione o template Class e informe o nome Aluno.vb e clique no botão Add. A seguir vamos definir o código 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 ação que pretendemos realizar na tabela e que poderá ser: inserir, atualizar, deletar e sem ação. A propriedade Acao foi definida na classe apenas para mostrar que podemos
definir outras propriedades além 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 código. Ex: para a classe Aluno, o código 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 transferência das informações sobre os objetos Classe e Aluno entre as demais camadas. Lembrando que um DTO não tem nenhum comportamento, exceto para armazenamento e recuperação de seus próprios dados (acessores e modificadores).
Passo 5. Definindo a camada de acesso a dados – CamadaDAL
A camada de acesso aos dados é responsável pelo acesso e pela persistência dos dados e nesta camada vamos definir as classes que contém os métodos genéricos para acessar e persistir dados e as classes específicas relacionadas com as classes do nosso domínio. Assim, teremos as seguintes classes nesta camada:
- AcessoDados – Classe genérica que contém os métodos para acesso e persistência de dados;
- ClasseDAL – Classe contém os métodos para acesso e persistência das informações sobre a entidade Classe;
- AlunosDAL – Classe contém os métodos para acesso e persistência das informações sobre a entidade Aluno;
Além destas classes, a camada de acesso a dados deverá possuir também um arquivo de configuração app.Config, onde iremos armazenar a string de conexão e um módulo chamado GlobalDAL.vb que conterá uma enumeração definindo as ações que poderemos fazer em nossas entidades.
1. Criando o arquivo de configuração app.config
Clique com o botão 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 conexão 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 módulo GlobalDAL.vb
Clique com o botão direito do mouse sobre o projeto CamadaDAL e selecione Add -> Module. A seguir, selecione o template Module e informe o nome GlobalDAL.vb. Depois defina neste arquivo o seguinte código:
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
- Criando a classe genérica AcessoDados (SQLHelp)
Clique com o botão direito do mouse sobre o projeto CamadaDAL e selecione Add -> Class. A seguir, selecione o template Class e informe o nome AcessoDados.vb e defina neste arquivo o seguinte código:
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).ConnectionString Catch ex As Exception MsgBox(ex.Message) End Try Else retorno = ConfigurationManager.ConnectionStrings("ConexaoSQLServer").ConnectionString 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() 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
Nesta classe temos definidos os seguintes métodos:
- GetConnectionString – obtém a string de conexão do arquivo app.config;
- Connect – Abre uma conexão com o banco de dados SQL Server;
- CloseConn – fecha a conexão aberta;
- ExecuteQuery – Executa um comando SQL e retorna um boleano;
- ExecuteAndGetReader – Executa um comando SQL e retorna um SqlDataReader;
- Sub New() (Construtor) – O construtor da classe; chama o método Connect;
- BeginTransaction – Inicia uma transação;
- CommitTransaction – Faz um commit na transação;
- RollBackTransaction – Cancela a transação;
Os métodos definidos nesta classe são de uso geral e serão usados para acessar o banco de dados SQL Server e realizar a persistência dos dados. Procurei manter este arquivo o mais simples possível, mas ele pode ser melhorado com outras opções.
- Criando a classe AlunosDAL com métodos específicos acessar e persitir dados de um objeto do tipo Aluno
Clique com o botão direito do mouse sobre o projeto CamadaDAL e selecione Add -> Class. A seguir, selecione o template Class e informe o nome AlunosDAL.vbe em seguida, defina neste arquivo o seguinte código:
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 métodos:
- DeletaAlunoPorId – exclui um aluno da tabela;
- GetAlunos – Obtém todos os alunos;
- GetAlunoPorId – Obtém um aluno pelo seu código;
- GetAlunosPorClasse – Obtém os alunos de uma classe;
- SalvaAluno – Salva os dados de um aluno.
- Criando a classe ClasseDAL com métodos específicos acessar e persitir dados de um objeto do tipo Classe
Clique com o botão direito do mouse sobre o projeto CamadaDAL e selecione Add -> Class e, a seguir, selecione o template Class e informe o nome ClasseDAL.vb. Após, defina neste arquivo o seguinte código:
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 métodos:
- DeletaClasse – Deleta uma classe;
- GetClasses – Obtém todas a classes;
- GetClassePorId – Obtém uma classe pelo seu código;
- Salva – Salva os dados de uma classe.
Nos métodos das classes AlunosDAL e ClasseDAL estamos usando instruções SQL como texto no código. Uma melhor opção seria a utilização de stored procedures por serem mais seguras e mais rápidas.
Aguarde os próximos passos na terceira parte do artigo.