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 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 estruturaTry _ds.ReadXml("Agenda.xml") ' Lemos os dados do arquivo agenda.xmlCatch Console.WriteLine("Erro ao ler o arquivo de dados XML.") End Try _dtCarregados = True End SubPublic 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 dadosXmlW.Close() End SubPublic 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 FunctionPublic 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.Emptydr("Cidade") = String.Emptydr("Estado") = String.Emptydr("CodPostal") = String.Emptydr("Telefone") = String.Emptydr("EMail") = String.Emptydt.Rows.Add(dr) 'salva os dados
Return False End Try Else Return False End If End Function Public Shared Function ExcluirReg(ByVal Nome As String) As Boolean
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.
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 ThenSalvarModificacoes() colocarDados() End IfDim f1 = New FrmNovaPessoa If f1.ShowDialog(Me) = DialogResult.OK Then colocarDados() End Iff1.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
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 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 = TrueSendKeys.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.
José Carlos Macoratti