VB.NET - Aplicação de acesso a dados em 3 camadas - parte 3


Se você perdeu a primeira parte deste artigo acompanhe em :

  1. VB.NET - Aplicação de acesso a dados em 3 camadas - parte 1
  2. VB.NET - Aplicação de acesso a dados em 3 camadas - parte 2

Apenas para lembrar ...

A solução criada no VS.NET 2003/VB2005 será composta de 3 projetos conforme descritos a seguir:

  1. Solução AgendaNet - composta por 3 projetos.
  2. Projeto AgendaNET - Representa a camada de apresentação da aplicação; é composto pelos formulários : FrmInicio.vb, Agenda.vb e FrmNovaPessoa.vb
  3. Projeto CamadaDeDados - Representa a camada de dados da aplicação; é composto pelo arquivo AgendaDB.vb que contém os métodos para tratamento dos dados.
  4. Projeto CamadaDeNegocios - Representa a camada de negócios da aplicação; é composto pelo arquivo Pessoa.vb  que defina a classe Pessoa suas propriedades e métodos.

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 :

Private Shared _dtCarregados As Boolean = False

Private Shared _ds As DataSet
 

Public Shared ReadOnly Property DadosCarregados() As Boolean

   Get

      Return _dtCarregados

   End Get

End 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 = True

End Sub
 

Public Shared Sub SalvarDados()


  'cria um novo arquivo XML

  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 Get

End Property
 

Public Shared Function ExibirPessoa(ByVal Nome As String) As DataRow


'seleciona a pessoa pelo nome o método Select() do objeto DataTable - Retorna um array

'de objetos DataRow que coincidem com critério definido. Por padrão as linhas no

'array são ordenadas pela chave primária , ou pela ordem na qual as linhas foram

'incluidas na tabela. Podemos usar o método Select() com um argumento opcional para

'selecionar registros de acordo com o estado de uma linha a partir da enumeração do

'DataViewRowState.


Dim
dr As DataRow() = _ds.Tables(0).Select("Nome='" + Nome + "'")

'se encontrou retorna o nome da pessoa

If (dr.Length > 0) Then

   Return dr(0)

Else

   Return Nothing

End If

End Function


Private
Shared Function Estrutura() As DataTable


'definimos um objeto Datatable e um DataColumn

Dim dt As New DataTable("Contatos")

Dim dc As DataColumn


'criamos a estrutura do arquivo de dados, todos os tipos são strings

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
 

Public Shared Function NovoReg(ByVal Nome As String) As Boolean


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


     SalvarDados()
 

     Return True

   Catch ex As Exception

      Return False

   End Try

Else

   Return False

End If
 

End Function

Public Shared Function ExcluirReg(ByVal Nome As String) As Boolean


Dim dr As DataRow = ExibirPessoa(Nome)

   If Not IsNothing(dr) Then

    Try

     'exclui a linha do arquivo

     dr.Delete()

     'salva os dados

    SalvarDados()

    Return True

   Catch ex As Exception

      Return False

   End Try

Else

   Return False

End 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 Try

Else

  Return False

End If

End Function

 

End Class

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:

Private Sub 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.


Dim tAuxiliar As New Thread(New ThreadStart(AddressOf Pessoa.ObservarContactos))

'inicia a linha de execução em segundo plano

tAuxiliar.Start()


'repete enquanto a thread não estiver 'viva'

Do While Not tAuxiliar.IsAlive

   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:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If _pessoaAtual.DadosModificados Then

   SalvarModificacoes()

   colocarDados()

End If
 

Dim f1 = New FrmNovaPessoa


If
f1.ShowDialog(Me) = DialogResult.OK
Then

   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
    _pessoaAtual.Modificar()
End If
End
Sub

Botão Excluir:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click


If _pessoaAtual.Nome <> String.Empty
Then

    If MessageBox.Show("Confirma exclusão do contato: " + _pessoaAtual.Nome + " da Agenda ? ", Me.Text, MessageBoxButtons.OKCancel) = DialogResult.OK Then

       If _pessoaAtual.Excluir() Then

          DataGrid1.DataSource = Pessoa.Contatos

          colocarDados()

      End If

    End 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 :

Public Sub 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 If

Next

'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
 

'este codigo em c# seria assim ...

'[C#]

' if (e.KeyChar == 13)

' {

' e.Handled = true;

' SendKeys.Send("{TAB}");

' }

End Sub

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

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:


José Carlos Macoratti