VB .NET - Como usar objetos DataSet  - IV


 

Para encerrar esta sequência de artigos sobre o objeto DataSet vamos mostrar como criar uma pequena aplicação usando o DataSet tipado através do assistente de configuração do Visual Studio e algumas pinceladas de código aqui e ali para fazer tudo ficar funcionando.

  1.  Como usar objetos DataSet I

  2.  Como usar objetos DataSet II

  3.  Como usar objetos DataSet III

 Acompanhe o Curso - VB .NET  - ADO .NET Prático (Curso) - e veja o que mudou na versão 2012.

 

Vou usar como exemplo o acesso a uma base de dados Access Northwind.mdb presente no diretório c:\teste.  Vamos acessar a tabela Produtos.

 

nota: O banco de dados Northwind.mdb que eu estou usando foi alterado para este exemplo:A tabela Produtos tem a seguinte estrutura:

 

a - Inicie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)

  1. Project Types : Visual Basic Projects
  2. Templates : Windows Application
  3. Name : DataSet_Acesso
  4. Location : c:\vbnet \dataset_Acesso

b- Na caixa de ferramentas selecione a aba - Data - e inclua o componente - OleDbDataAdapter - no formulário padrão - form1.vb.

 

 

c- A seguir na tela de configuração do Data Adapter clique no botão New Connection...

 

 

d- A seguir conforme telas mostradas abaixo , defina o provedor usado na conexão na aba Provedor ; Na aba Conexão selecione o banco de dados e clique no botão - Testar Conexao.

 

 

Na tela - Data Adapter Configuration Wizard - selecione - Use SQL statements e clique no botão - Next .

 

 

A seguir informe a instrução SQL , conforme abaixo , e clique no botão - Finish .

 

Nota: Voce pode clicar no botão  - Query Builder - para criar a instrução SQL.

 

Observe que estão visíveis no formulário os componentes

  1. OleDbConnection1: responsável pela conexão ao banco de  dados;

  2. OleDbDataAdapter1:  responsável pela comunicação  DataSet e a base de dados;

Além destes componentes visíveis ,  na seção Properties temos os componentes : OleDbSelectCommand1 , OleDbInsertCommand1, OleDbUpdateCommand1, OleDbDeleteCommand1  responsáveis pelos comandos SQL que selecionam ,  inserem , atualizam e excluem dados.

 

 

 

 

Vamos agora incluir um DataSet ao nosso projeto. Clique no componente OleDbDataAdapter1 com o botão direito do mouse e selecione : Generate DataSet.

 

 

Na próxima janela vamos criar um novo DataSet . Clique em New e informe o nome do DataSet ( Eu vou usar o nome Produtos) . A seguir clique em OK . Pronto !

 

Produtos representa a classe.

 

Produtos1 representa a instância da classe Produtos. A instância pode ser usada como argumento para preencher o DataSet , atualizar a base de dados , dentre outras operações.

 

 

O projeto agora possui uma classe DataSet e uma instância dela no formulário conforme a figura mostrada abaixo:

 

 

Agora que já temos um DataSet no projeto vamos criar um formulário com alguns botões que implementam as seguintes funcionalidades :

No formulário vamos incluir um componente DataGrid , alguns botões de comando , um GroupBox e algumas Labels , conforme figura abaixo:

 

 

 

No componente DataGrid devemos definir as propriedades DataSource e DataMembers assim :

  1. DataSource = Produtos1

  2. DataMember =  Produtos

- Preenchendo o DataGrid

 

No evento Click do botão - Preenche DataGrid - vamos inserir o código que preenche o DataGrid com os dados. ( eu poderia fazer isto de forma automática colocando o código no evento Load do formulário.)

 

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

    Produtos1.Clear()


   OleDbDataAdapter1.Fill(Produtos1)
End Sub

 

- Excluindo um registro

 

Para excluir um registro , eu vou usar o campo CódigoDoProduto para identificar o produto a ser removido. Vou usar o função InputBox para informar o código do produto a ser excluído.  Eu tenho que converter o valor informado para um valor inteiro - Convert.ToInt32(codproduto).

Para remover o registro utilizo o método Remove -   Produtos1.Produtos.Rows.Remove(registro). Veja o código abaixo:

 

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

 

Dim codproduto As String

codproduto = InputBox("Informe o codigo do produto a excluir ", "Código do Produto")

 

If codproduto <> "" Then

    Dim registro As Produtos.ProdutosRow = Produtos1.Produtos.FindByCódigoDoProduto(Convert.ToInt32(codproduto))

    ' verifica se encontrou algum registro

    If registro Is Nothing Then

       MsgBox("Não localizei produto com este código")

    Else

       Produtos1.Produtos.Rows.Remove(registro)

    End If

Else

     MsgBox("Codigo do produto inválido ! ", MsgBoxStyle.Exclamation, "Remover Produto")

End If

End Sub

 

- Incluindo registros

 

A inclusão de registros é feita diretamente no DataGrid . Basta se posicionar e informar os valores dos novos dados. Na figura abaixo eu mostro a inclusão de um registro :

 

 

Nota : Para incluir uma nova linha na tabela poderíamos ter usado o código abaixo. Estamos fazendo isto no 'queixo duro' por questão de simplicidade. É claro que devemos respeitando a estrutura da tabela produtos , caso contrário ocorrerá um erro.

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

  ' Insere um novo registro

  Produtos1.Produtos.AddProdutosRow("Teste ", 10, 1, "1 caixa de teste", 3.33D, 200, 400, 250, False)

End Sub

 

- Atualizando a base de dados

 

As operações de inclusão e exclusão explicadas acima , somente irão se refletir na base de dados após ser feita a atualização da mesma. Se você fizer qualquer operação que altere os dados e não atualizar a base de dados as mudanças não irão ser refletidas na base de dados.

 

O código abaixo mostra como atualizar a base de dados com as alterações feitas . No evento Click do botão - Atualizar - insira o código abaixo:

 

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

 

' Verifica ocorreu alguma alteração nos dados

If Produtos1.HasChanges() Then

   ' Obtém as alterações efetuadas

   Dim Alterados As DataSet = Produtos1.GetChanges()

  ' verifica se realmente houve alterações

   If Not Alterados Is Nothing Then

      ' manda as alterações para o banco

          OleDbDataAdapter1.Update(Alterados)

          Produtos1.AcceptChanges()

   End If

End If

End Sub

 

- Primeiro eu verifico se houve alguma alteração nos dados - Produtos1.HasChanges()

- A seguir eu crio um novo DataSet - Alterados - com os dados que foram alterados - Produtos1.GetChanges()

- Depois eu atualizo a fonte de dados - OleDbDataAdapter1.Update(Alterados)

- E finalmente as alterações são passadas para a base de dados : Produtos1.AcceptChanges()

 

Nota : uma outra forma de fazer a atualização seria usar somente o seguinte código :  OleDbDataAdapter1.Update(Produtos1)

 

- Pesquisando Dados

 

Podemos pesquisar dados na tabela usando o - campo CódigoDoProduto - . Para fazer isto definimos uma variável registro , á qual será informada o código pelo qual deverá ser feita a busca. Se for encontrado exibimos os valores dos campos do registro.

 

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

 

Dim codproduto As String

codproduto = InputBox("Informe o codigo do produto a excluir ", "Pesquisar Código do Produto")

 

If codproduto <> "" Then

    Dim registro As Produtos.ProdutosRow = Produtos1.Produtos.FindByCódigoDoProduto(Convert.ToInt32(codproduto))

    ' Verifica se encontrou o registro

    If registro Is Nothing Then

       MsgBox("Produto não localizado !")

    Else

       MsgBox(" Produto : " & registro.NomeDoProduto & " Preço R$ " & registro.PreçoUnitário)

    End If

Else

    MsgBox("Codigo do produto inválido ! ", MsgBoxStyle.Exclamation, "Pesquisa por código do Produto")

End If

End Sub

 

- Atualizando todos os registros

 

Podemos alterar todos os registros da tabela usando um laço para percorrer cada registro da mesma e alterar um campo desejado. No exemplo eu estou realizando um reajuste no preço . O usuário informa o índice e cada campo PreçoUnitário é reajustado segundo a formula : 

 

Registro.PreçoUnitário = Registro.PreçoUnitário + (Registro.PreçoUnitário * (Convert.ToInt32(indice) / 100))

 

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

 

Dim Registro As Produtos.ProdutosRow

Dim i As Integer

Dim indice As String

indice = InputBox("Informe o percentual (%) do reajuste dos preços dos produtos . Ex: 10 ( 10%) ", "Percentual de Reajuste")

 

If indice <> "" Then

   ' percorre a tabela

   For i = 0 To Produtos1.Produtos.Rows.Count - 1

      ' Pega o registro

      Registro = Produtos1.Produtos(i)

      ' Modifica o preço

      Registro.PreçoUnitário = Registro.PreçoUnitário + (Registro.PreçoUnitário * (Convert.ToInt32(indice) / 100))

   Next

   MsgBox(" Todos os registros foram reajustados com sucesso !", MsgBoxStyle.Information, "Reajuste")

Else

   MsgBox("O valor do indice de reajuste é inválido ! ", MsgBoxStyle.Exclamation, "indice de reajuste")

End If

 

Você esta percebendo como é fácil trabalhar com DataSets desta forma. Graças aos DataSets tipados isto é possível . Sim DataSets tipados. !!

 

Os DataSets podem ser tipados ou não .  Um DataSet tipado é um dataset que é derivado de uma classe DataSet e que usa a informação contida em um arquivo de esquema XML ( .xsd ) para gerar uma nova classe. Toda a informação do esquema ( tabelas , colunas, linhas , etc..) é gerada e compilada neste nova classe DataSet. Como esta nova classe é derivada (herdar) da classe DataSet ela assuem toda a funcionalidade da classe DataSet.

 

Um DataSet não tipado não possui um corresponde arquivo de esquema , ele também possui tabelas , colunas , linhas , etc mas que são expostas somente como uma coleção.  Você é quem deverá informar os nomes dos itens presentes nas coleções . Isto pode levar a que os erros sejam detectados somente na hora da compilação.  Por exemplo , a linha de código abaixo tem um erro de digitação no nome da tabela que será detectado somente quando você for compilar o código

 

Ex: dim dt As Datatable = ds.Tables("Prodtos")

 

Vejamos a seguir a comparação entre dois códigos que acessam dados . Um usa  DataSets tipados e outro não tipado:

 

Usando DataSet tipados Usando DataSets não tipados
' Acessando a coluna CustomerID na 1a linha da tabela Customers

Dim s As String
s = dsCustomersOrders1.Customers(0).CustomerID
 

Dim s As String
s = CType(dsCustomersOrders1.Tables("Customers").Rows(0).Item("CustomerID"), String)
 

Além de ser mais fácil de usar um DataSet tipado permite que você use o recurso da intellisense no seu código ao usar o editor do Visual Studio. É claro que haverá ocasiões que você vai ter que usar um DataSet não tipado .

Fechamos aqui o clico de artigos sobre a classe DataSet . Há ainda muito o que falar sobre ela , farei isto em outros artigos sobre o assunto. Aguardem...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti