 VB.NET - 
Aplicação de acesso a dados em 3 camadas - parte 3
 
VB.NET - 
Aplicação de acesso a dados em 3 camadas - parte 3
Se você perdeu a primeira parte deste artigo acompanhe em :
Apenas para lembrar ... 
A solução criada no VS.NET 2003/VB2005 será composta de 3 projetos conforme descritos a seguir:
Vou apresentar neste artigo o Projeto CamadaDeDados. O principal arquivo desta camada é o arquivo AgendaBD.vb. A classe AgendaBD definida neste arquivo possui os seguintes métodos e propriedades:
- Propriedade DadosCarregados - É somente leitura e estática e retorna se os dados foram carregados.
- Método carregarDados() - Carrega os dados e define o valor da propriedade acima definida
- Método SalvarDados() - Cria um novo arquivo XML e salva os dados
- Propriedade Dados() - È somente leitura e estática e retorna o objeto DataTable
- Método ExibirPessoa() - Retorna o nome de uma pessoa
- Método Estrutura() - Cria e retorna a estrutura de um objeto DataTable
- Método NovoReg() - Inclui um novo registro no DataTable
- Método ExcluirReg() - Exclui um registro do arquivo
- Método ModificarReg() - Altera um registro do arquivo
O código completo da classe AgendaBD é dado a seguir :
| PrivateShared _dtCarregados As Boolean = False Private Shared _ds As DataSet Public Shared ReadOnly Property DadosCarregados() As BooleanGet Return _dtCarregados End GetEnd Property Public Shared Sub carregarDados() _ds = New DataSet ' Criamos uma nova instancia de um dataset _ds.Tables.Add(Estrutura()) ' Incluimos a estrutura Try _ds.ReadXml("Agenda.xml") ' Lemos os dados do arquivo agenda.xml Catch Console.WriteLine("Erro ao ler o arquivo de dados XML.") End Try _dtCarregados = TrueEnd Sub Public Shared Sub SalvarDados() 
     Dim miFS As New FileStream("Agenda.xml", FileMode.Create) Dim XmlW As New XmlTextWriter(miFS, System.Text.Encoding.Unicode) _ds.WriteXml(XmlW) ' Salvamos os dados XmlW.Close() End Sub Public Shared ReadOnly Property Dados() As DataTable Get Return _ds.Tables(0) End GetEnd Property Public Shared Function ExibirPessoa(ByVal Nome As String) As DataRow 
     Dim dr As DataRow() = _ds.Tables(0).Select("Nome='" + Nome + "'") 'se encontrou retorna o nome da pessoaIf (dr.Length > 0) Then Return dr(0) Else Return NothingEnd If End Function Private Shared Function Estrutura() As DataTable 
     Dim dc As DataColumn 
     dc = New DataColumn("Nome", System.Type.GetType("System.String")) dt.Columns.Add(dc) dc = New DataColumn("Endereco", System.Type.GetType("System.String")) dt.Columns.Add(dc) dc = New DataColumn("Cidade", System.Type.GetType("System.String")) dt.Columns.Add(dc) dc = New DataColumn("Estado", System.Type.GetType("System.String")) dt.Columns.Add(dc) dc = New DataColumn("CodPostal", System.Type.GetType("System.String")) dt.Columns.Add(dc) dc = New DataColumn("Telefone", System.Type.GetType("System.String")) dt.Columns.Add(dc) dc = New DataColumn("EMail", System.Type.GetType("System.String")) dt.Columns.Add(dc) Return dt 
    End 
    Function If IsNothing(ExibirPessoa(Nome)) Then Try 'define uma novo datatabela com base na tabela origem Dim dt As DataTable = _ds.Tables(0) 'incluimos uma nova linha na tabela Dim dr As DataRow = dt.NewRow 'atribuimos somente o nome dr("Nome") = Nome 'os demais dados estão vazios dr("Endereco") = String.Empty dr("Cidade") = String.Empty dr("Estado") = String.Empty dr("CodPostal") = String.Empty dr("Telefone") = String.Empty dr("EMail") = String.Empty dt.Rows.Add(dr) 'salva os dados 
 Return TrueCatch ex As Exception Return False End TryElse Return False End If End Function Public Shared Function ExcluirReg(ByVal Nome As String) As Boolean 
 If Not IsNothing(dr) Then Try 'exclui a linha do arquivo dr.Delete() 'salva os dados SalvarDados() Return True Catch ex As Exception Return FalseEnd Try Else Return FalseEnd If End Function Public Shared Function ModificarReg(ByVal dados As String()) As Boolean 'exibe os dados pelo nome (dados(0) Dim dr As DataRow = ExibirPessoa(dados(0)) 'se o datarow não estiver vazio então pega os demais dados If Not IsNothing(dr) Then Try'inicia a alteracao de dados dr.BeginEdit() 'comeca pelo endereço (dados(1)) pois dados(0) representa o nome dr("Endereco") = dados(1) dr("Cidade") = dados(2) dr("Estado") = dados(3) dr("CodPostal") = dados(4) dr("Telefone") = dados(5) dr("EMail") = dados(6) dr.EndEdit() SalvarDados() Return True Catch Return False End TryElse Return FalseEnd If End Function 
 EndClass | 
A camada de dados é usada pela interface para efetuar o acesso aos dados. No evento Load do formulário Agenda.vb temos o código a seguir que mostra isto:
| PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'criamos um subprocesso(thread) que lê os dados e o iniciamos'note que você não precisou criar uma instância da classe Pessoa pois o método ObservarContatos é estatico 'o operador AddressOf é usado para criar um objeto delegate para o método ObserverContatos() 'um delegate é um ponteiro de função orientado a objeto e aponta para um procedimento ou método. 
 'inicia a linha de execução em segundo plano tAuxiliar.Start() 
     Loop 'Carregamos e mostramos o formulario Inicial durante 5 segundos Dim f1 As New FrmSplash(5, tAuxiliar) f1.ShowDialog(Me) 'libera o objeto f1.Dispose() 'exibe os dados no datagrid DataGrid1.DataSource = Pessoa.Contatos 'coloca os dados nas caixas de texto colocarDados() End Sub | 
No código acima , executado quando o formulário é carregado, temos a exibição do formulário inicial e a seguir os datagrid surge com os dados obtidos pelo método Contatos da classe de negócio Pessoa. Lembre-se que o método é estático(shared) e retorna um DataTable que é obtido da classe de negócio AgendaBD pelo método carregarDados().
O método colocarDados do formulário Agenda.vb preenche as caixas de texto com os dados obtidos da camada de dados via classe AgendaBD.
Os eventos Click dos botões Novo e Excluir realizam operações na base de dados usando a camada de negócios :
Botão Novo:
| PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If _pessoaAtual.DadosModificados Then SalvarModificacoes() colocarDados() 
    End 
    If 
     colocarDados() End If f1.Dispose() End Sub | 
Rotina SalvarModificações:
| Private Sub 
    SalvarModificacoes() 
    If 
    MessageBox.Show("Os dados foram modificados, Deseja salvar as modificações 
    ?", Me.Text, 
    MessageBoxButtons.OKCancel) = DialogResult.OK
    Then  | 
Botão Excluir:
| PrivateSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
 DataGrid1.DataSource = Pessoa.Contatos colocarDados() End IfEnd If End If End Sub | 
A seguir temos o código de duas rotinas auxiliares que são usadas no projeto:
- Limpa os controles do formulário :
| PublicSub Limpar(ByVal controlP As Control) Dim ctl As Control 'limpa os controles textbox do formulario'a função é recursiva pois pode haver controles que contenham controles For Each ctl In controlP.Controls If TypeOf ctl Is TextBox Then DirectCast(ctl, TextBox).Text = String.Empty ElseIf ctl.Controls.Count > 0 Then Limpar(ctl) End IfNext 'este codigo no vb5/6 seria assim... 'Dim MyControl As Control 'For Each MyControl In Controls ' If TypeOf MyControl Is TextBox Then ' MyControl.Text = "" ' End If 'Next End Sub End Class | 
- Permitir Teclar ENTER e enviar um TAB:
| Private
    Sub Form1_KeyPress(ByVal 
    sender As
    Object,
    ByVal e
    As System.Windows.Forms.KeyPressEventArgs)
    Handles
    MyBase.KeyPress If e.KeyChar = Convert.ToChar(13) Then e.Handled = True SendKeys.Send("{TAB}") 
    End 
    If | 
E este é o último artigo da série : Aplicação de acesso a dados em 3 camadas.
Pegue o código completo do projeto aqui :
 AgendaNet.zip
AgendaNet.zip
Aguarde em breve mais novidades e aplicações exemplos na plataforma .NET.
Nota: Esta aplicação foi baseada em alguns exemplos encontrados na web.
| Veja os 
    Destaques e novidades do SUPER DVD Visual Basic 
(sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? | 
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a 
Objetos com VB .NET
