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 :
Private Shared _dtCarregados As Boolean = False Private Shared _ds As DataSetPublic Shared ReadOnly Property DadosCarregados() As Boolean GetReturn _dtCarregados End Get End PropertyPublic 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 SubPublic 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 Get End PropertyPublic 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 pessoa If (dr.Length > 0) ThenReturn dr(0) Else Return Nothing End If End FunctionPrivate 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 True Catch ex As ExceptionReturn False End Try Else Return False End IfEnd 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 False End Try ElseReturn False End If End FunctionPublic 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 dadosdr.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 ElseReturn 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.
'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:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickIf _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:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
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.ControlsIf 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 SubEnd 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
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