VB .NET - Como usar objetos DataSet - I


Rei morto , rei posto !

Lembra da ADO e do objeto Recordset ?

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

Pois bem , agora estamos em tempos de VB.NET , ASP.NET e ADO.NET. Se você procurar pelo objeto recordset na nova plataforma vai perceber que ele é coisa do passado. (embora você ainda possa usar objetos recordsets com ADO.NET). Apenas para relembrar veja os artigos sobre o assunto :

  1. VB.NET - ADO.NET - uma visão geral IV : Objeto DataSet.
  2. VB.NET - Alimentando um DataSet com múltiplas tabelas
  3. VB.NET -  Usando um Recordset ADO com ADO.NET
  4. ADO .NET - O acesso aos Dados.

O objeto DataSet é o foco principal da programação ADO.NET.

A principal característica do DataSet é ser totalmente desconectado , você pode usar um DataSet para armazenar dados de um banco de dados e pode também mover os dados de um DataSet para um banco de dados , mas o próprio DataSet não faz conexão alguma com o banco de dados , ele nem mesmo tem um objeto para realizar tal conexão .

A ligação entre o banco de dados e DataSet é feita pelo objeto DataAdapter (Adaptador de dados). Abaixo uma ilustração que procura mostrar a interação entre os objetos ADO.NET e o modelo desconectado com o DataSet.

O objeto DataSet da ADO.NET é uma representação na memória dos dados e fornece um consiste modelo independente de programação relacional de uma fonte de dados . O DataSet inclui as tabelas , relacionamentos , restrições , etc.

Quando usar um DataSet ?

A menos que você não precise usar as capacidades avançadas do DataSet , deverá sempre usar o objeto DataReader , pois ele oferece o melhor desempenho. Agora se você precisar usar uma das propriedades inerentes ao objeto DataSet listadas abaixo , ele deverá ser a sua escolha:

  1. Armazenar dados por um longo período
  2. Transferir dados para outras classes
  3. Fazer atualizações e alterações nos dados sem usar procedimentos armazenados nem declarações SQL
  4. Salvar e recuperar dados como um arquivo XML
  5. Poder ler dados e navegar pelos dados sem restrições para frente e para trás entre as tabelas do banco de dados

Como preencher um DataSet usando um objeto DataAdapter ?

Como já dissemos , embora o  DataSet armazene os dados ele não conhece nada da fonte de dados e precisa que alguém busque esses dados para preenchê-lo. Entra em cena então o objeto DataAdapter : OledbDataAdapter e SqlSataAdapter.

Sua função basicamente é a seguinte :

  1. acessar a fonte de dados através de uma conexão prévia
  2. fazer a consulta na base de dados
  3. Obter os dados
  4. Preencher o DataSet

Não pense que o serviço do DataAdapter pare por ai ; quando os dados que foram alterados no DataSet precisam voltar para o banco de dados para atualizar a fonte de dados , novamente o DataAdapter atua :

  1. Ele lê os dados do DataSet
  2. Verifica quais dados foram alterados
  3. Envia ao banco de dados via conexão os dados para atualizar a fonte de dados.

Para acessar o banco de dados , executar o comando SQL via DataAdapter , trazer os dados e preencher o DataSet usamos o método Fill .

O método Fill retorna a linhas de uma fonte de dados usando a declaração SELECT definida por uma propriedade SelectCommand associada. O objeto Connection associado com a declaração SELECT precisa ser válido mas não precisa ser aberto. Se a conexão for fechada antes de você chamar o método Fill ela será aberta para que os dados possam ser retornados e em seguida fechada novamente. Se a conexão estiver aberta ela permanecerá aberta após o uso do método Fill.

O método Fill então irá incluir as linhas ao objeto DataTable de destino , criando o objeto DataTable , se ele ainda não tiver sido criado. Ao criar o objeto DataTable a operação Fill normalmente cria somente colunas com medadata.

Se o DataAdapter encontrar colunas duplicatas enquanto preenche o DataTable ele irá gerar nomes para as colunas seguintes usando o padrão "columnname1","columnname2", "columnname3" e assim por diante .  Quando múltiplos conjuntos de registros forem incluidos em um DataSet cada conjunto de registro será colocado em uma tabela separada.

Então para começar vamos precisar criar um objeto Connection e um objeto Command antes de poder recuperar os dados que precisamos , vamos lá... :

1- Inicie o Microsoft Visual Studio .Net 7.0 e abra um novo projeto selecionando - New Project.

2- Na janela New Project Selecione em Project Type : Visual Basic Projects e em Templates: ASP.NET Web Application . Vamos dar o nome ao nosso projeto de DataSet1. No final clique em OK.

3-Insira no formulário padrão os seguintes componentes: Um DataGrid , um Button  e um TextBox. No evento Click do botão - Button1 - insira o seguinte código :

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

 

'define a string de conexão com o banco de dados

Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TextBox1.Text

 

'define o objeto OledbConnection usando a string de conexão

Dim conexao As New OleDbConnection(strConn)

 

'define a instrução SQL que será usada para extrair as linhas da tabela Authors

Dim sql As String = "Select * from Authors Where Au_ID < 20"

 

'cria o objeto OleDbCommand

Dim comando As New OleDbCommand(sql, conexao)

 

'Cria o objeto DataAdapter

Dim adaptador As New OleDbDataAdapter(comando)

 

'Cria o objeto DataSet

Dim dsbiblio As New DataSet()

 

'preenche o dataset

adaptador.Fill(dsbiblio, "Authors")

 

'exibe os dados em um datagrid

DataGrid1.DataSource = dsbiblio

End Sub

Veja na figura abaixo o resultado da exibição do DataSet no DataGrid.

- No código acima perceba que eu não abri a conexão para preencher o DataSet . Apenas usei : adaptador.Fill(dsbiblio, "Authors")

- Eu poderia ter feito assim :

conexao.Open()

'preenche o dataset

adaptador.Fill(dsbiblio, "Authors")

conexao.Close()

 

ou ainda poderia ter aberto a conexão e não ter fechado, também ia funcionar.

Nota: O mesmo código pode ser usado quase sem alteração alguma para exibir os dados de uma tabela em um DataGrid em uma página ASP.NET.

 

E se eu quiser preencher um DataSet com dados de mais de uma tabela ?  Eu posso carregar a tabela Publisher do banco de dados Biblio.mdb ?

A resposta é :  Sim , sem problemas. 

Como já disse o DataSet possui o objeto DataTable e ,  o objeto DataTable é a representação em memória de uma única tabela com seus campos, registros , chaves, índices e constraints. Como o DataSet possui também uma coleção de objetos DataTable ele pode conter dados de mais de uma tabela , seus relacionamentos , chaves , etc... .  Vejamos como fazer isto de duas maneiras :

1- Criando dois objetos DataAdapter

Eu apenas vou ter que criar mais um objeto DataAdapter com os dados da tabela Publishers que eu quero retornar. Veja como ficará o código :

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

 

'define a string de conexão com o banco de dados

Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TextBox1.Text

 

'define o objeto OledbConnection usando a string de conexão

Dim conexao As New OleDbConnection(strConn)

 

'define a instrução SQL que será usada para extrair as linhas da tabela Authors

Dim sql As String = "Select * from Authors Where Au_ID < 20"

 

'define a instrução SQL2 que será usada para extrair as linhas da tabela Publishers

Dim sql2 As String = "Select PubID , Name , [Company Name] from Publishers Where PubID < 20"

 

'Cria o objeto DataAdapter

Dim adaptador As New OleDbDataAdapter(sql, conexao)

Dim adaptador1 As New OleDbDataAdapter(sql2, conexao)

 

'Cria o objeto DataSet

Dim dsbiblio As New DataSet()

 

'preenche o dataset com tabela Authors

adaptador.Fill(dsbiblio, "Authors")

'preenche o dataset tabela Publishers

adaptador1.Fill(dsbiblio, "Publishers")

 

'exibe os dados em um datagrid

DataGrid1.DataSource = dsbiblio

End Sub

Perceba que eu apenas defini mais uma instrução SQL relativa a tabela Publishers e criei dois objetos DataAdapter. O resultado obtido será o seguinte:

figura 1.0 figura 2.0

2- Usando somente um objeto DataAdapter

Outra forma de obter o mesmo resultado sem criar um novo objeto DataAdapter é mudar a propriedade CommandText do objeto Command e usar novamente o método Fill para preencher o DataSet (eu poderia também criar um novo objeto Command). Veja como fica o código neste caso:

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

 

'define a string de conexão com o banco de dados

Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TextBox1.Text

 

'define o objeto OledbConnection usando a string de conexão

Dim conexao As New OleDbConnection(strConn)

 

'define a instrução SQL que será usada para extrair as linhas da tabela Authors

Dim sql As String = "Select * from Authors Where Au_ID < 20"

'cria o objeto OleDbCommand

Dim comando As New OleDbCommand(sql, conexao)

 

'Cria o objeto DataAdapter

Dim adaptador As New OleDbDataAdapter(comando)

 

'Cria o objeto DataSet

Dim dsbiblio As New DataSet()

 

'preenche o dataset com tabela Authors

adaptador.Fill(dsbiblio, "Authors")

 

comando.CommandText = "Select PubID , Name , [Company Name] from Publishers Where PubID < 20"

adaptador.Fill(dsbiblio, "Publishers")

 

'exibe os dados em um datagrid

DataGrid1.DataSource = dsbiblio

End Sub

 

O resultado obtido será o mesmo da figura 1.0 e 2.0 já mostradas acima.

Nota: Qualquer número de DataAdapters pode ser usado em conjunção com o DataSet. Cada DataAdapter pode ser usado para preencher (Fill) uma ou mais objetos DataTable . Os objetos DataRelations e Constraint podem ser incluidos no DataSet localmente , possibilitando assim que você relacione dados de múltiplas fonte de dados .

Exemlo : um DataSet pode conter dados de um banco de dados SQL Sever e dados de um banco de dados DB2. Abaixo temos um exemplo de código que usa duas fontes de dados : SQL Server 2000 e Microsoft Access , relacionadas via objeto DataRelation.

Dim custConn As SqlConnection= New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind;")
Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", custConn)

Dim orderConn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                                       "Data Source=c:\Program Files\Microsoft Office\"Office\Samples\northwind.mdb;")

Dim orderDA As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM Orders", orderConn)

custConn.Open()
orderConn.Open()

Dim custDS As DataSet = New DataSet()

custDA.Fill(custDS, "Customers")
orderDA.Fill(custDS, "Orders")

custConn.Close()
orderConn.Close()

Dim custOrderRel As DataRelation = custDS.Relations.Add("CustOrders", custDS.Tables("Customers").Columns("CustomerID"), _
                                     custDS.Tables("Orders").Columns("CustomerID"))


Dim pRow, cRow As DataRow

For Each pRow In custDS.Tables("Customers").Rows
    Console.WriteLine(pRow("CustomerID").ToString())

    For Each cRow In pRow.GetChildRows(custOrderRel)
        Console.WriteLine(vbTab & cRow("OrderID").ToString())
    Next
Next

 

Na sequência deste artigo vou mostrar como trabalhar com os objetos DataTables, acessar os dados de um DataSet  , apagar registros e otras cosias mas...

 

Acompanhe a continuação no link:... Como usar objetos DataSet II

 

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