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