VB .NET - Como usar objetos DataSet - II


 

Um objeto DataSet é composto por uma coleção de objetos DataTable , cada um dos objetos mapeia uma estrutura de uma tabela com campos e registros. Cada registro de um objeto DataTable é representado por um objeto  DataRow , e , uma coleção de objetos DataRow compõe a coleção RowsCollection que é formada pela propriedade Rows.

 

Como o objeto DataSet não tem conexão com um banco de dados podemos usar suas propriedades para preencher um DataSet via código.  Sim isto mesmo , podemos criar objetos de banco de dados como qualquer outro objeto . Vamos mostrar isto no código abaixo :

 

Private mDataSet As DataSet

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

mDataSet = New DataSet("Notas dos alunos")

 

 

'criando a tabela alunos

Dim Alunos As New DataTable("Alunos")

mDataSet.Tables.Add(alunos)

Alunos.Columns.Add("Aluno_ID", GetType(Integer))

Alunos.Columns.Add("AlunoNome", GetType(String))

 

 

'criando a tabela Notas

Dim Notas As New DataTable("Notas")

mDataSet.Tables.Add(Notas)

Notas.Columns.Add("Aluno_ID", GetType(Integer))

Notas.Columns.Add("Aluno_Nota", GetType(Integer))

 

 

'Alimentando a tabela alunos

Dim Dados_Alunos(1) As Object

Dados_Alunos(0) = 1

Dados_Alunos(1) = "Macoratti"

Alunos.Rows.Add(Dados_Alunos)

 

'Alimentando a tabela notas

Dim Dados_Notas As DataRow

Dados_Notas = Notas.NewRow

Notas.Rows.Add(Dados_Notas)

Dados_Notas.Item("Aluno_ID") = 1

Dados_Notas.Item("Aluno_Nota") = 7

 

 

'vinculando o dataset ao datagrid

DataGrid1.DataSource = mDataSet

End Sub

 

O código acima mostra como podemos criar um DataSet e preenchê-lo com dados de duas tabelas , tudo isto via código. Abaixo temos o resultado da apresentação da tabela Alunos e da tabela Notas. Basicamente fizemos o seguinte:

Abaixo o resultado do processamento do código acima , expondo as tabelas e os dados em um componente DataGrid.

 

 

Podemos usar os objetos : Tables , DataTable, Columns e Rows para examinar a estrutura de um banco de dados. Vejamos alguns exemplos de como fazer isto usando as propriedades das coleções (lembre-se que toda coleção possui as propriedades Count , item , etc...)

 

- Percorrendo tabelas em um objeto DataSet - ds.

 

Dim dt as DataTable

For Each dt in ds.Tables

    Console.Writeline(dt.TableName)

Next

Dim n as integer

For n = 0 To dsTables.Count - 1

    Console.Writeline(ds.Tables(n).TableName)

Next

Percorre o Datable através das tabelas existentes O mesmo resultado é obtido usando um índice numérico

 

- Percorrendo linhas em um objeto DataTable - dt

 

Dim row as DataRow

For Each row in dt.rows

    Console.Writeline(row(0))

Next

Dim n as integer

For n = 0 To dt.rows.Count - 1

    Console.Writeline(dt.rows(n)(0))

Next

Percorre todas as linhas da tabela dt e exibe a primeira coluna - row(0) O mesmo resultado é obtido usando um índice numérico

 

Abaixo um exemplo de código para exibir algumas propriedades da tabela Authors que carregamos previamente no DataSet.

 

Private Sub ExibeEstrutura(ByVal myDataSet As DataSet)

 

Dim dt As DataTable

Dim dc As DataColumn

Dim pk As DataColumn

Dim dr As DataRow

 

For Each dt In myDataSet.Tables

ListBox1.Items.Add(" O DataSet possui : " & myDataSet.Tables.Count & " tabela ")

ListBox1.Items.Add(" A tabela " & dt.TableName & " tem " & dt.Rows.Count & " linhas ")

ListBox1.Items.Add(" Sua estrutura é a seguinte : ")

 

For Each dc In dt.Columns

ListBox2.Items.Add("Coluna :" & dc.ColumnName & " ")

ListBox2.Items.Add("Tipo :" & dc.DataType.ToString & " ")

ListBox2.Items.Add("Nulo :" & dc.AllowDBNull & " ")

ListBox2.Items.Add("Unico :" & dc.Unique & " ")

Next

Next

End Sub

 

A seguir resultado do processamento exibindo as propriedades da tabela Authors carregada no DataSet.

 

 

Para localizar linhas especificas em uma tabela a classe DataTable fornece o método Select . O Método Select retorna um array contendo todas as linhjas na tabela ( um array de objetos DataRow) que coincidem com o critério usado para busca. A sintaxe do método Select é :

 

Public Overloads Function Select (ByVal FilterExpression As String , ByVal sort As String , ByVal recordStates as System.Data.DataViewRowState ) As System.Data.DataRow()

 

onde os parâmetros são :

 

- FilterExpression - Informa o critério para selecionar os registros. (Equivalente a string da cláusula SQL WHERE)

- sort - Especifica como as linhas retornadas serão ordenadas. ( Equivalente a cláusula SQL  ORDER BY )

- recordStates - define a versão dos registros que serão retornados. O valor informado neste parâmetro pode ser :

Nota : Existe um método Select sobrecarregado que usa somente dois parâmetros : FilterExpression e sort.

 

Ex:     Dim rows () As DataRow = dt.Select("Nome = " 'Macoratti'")  retorna somente as linhas com nome igual a Macoratti0

 

Abaixo temos um código que mostra como usar o método Select com uma tabela. Usamos o método duas vezes , uma para exibir os registros com um filtro definido ( id <5 ) , na outra vez não usamos nenhum parâmetro e exibimos todos os registros.

 

Private Sub GetRowsByFilter()
  
    Dim customerTable As DataTable
    customerTable = new DataTable( "Customers" )

    ' Inclui colunas
    customerTable.Columns.Add( "id", GetType(Integer) )
    customerTable.Columns.Add( "name", GetType(String) )

    ' Define a chave Primária
    customerTable.Columns("id").Unique = true
    customerTable.PrimaryKey = new DataColumn() { customerTable.Columns("id") }

    ' inclui 10 linhas
    Dim id As Integer
    For id = 1 To 10
        customerTable.Rows.Add(new object() { id, string.Format("customer{0}", id) } )
    Next id
    customerTable.AcceptChanges()

    ' inclui mais 10 linhas
    For id = 11 To 20
        customerTable.Rows.Add( new object() { id, string.Format("customer{0}", id) } )
    Next id

    Dim strExpr As String
    Dim strSort As String
  
    strExpr = "id > 5"
    ' ordena pelo campo CompanyName

    strSort = "name DESC"
    ' Usa o método Select para encontrar todas as linhas que coincidem com o criterio.
    Dim foundRows As DataRow() =  customerTable.Select( strExpr, strSort, DataViewRowState.Added )
  
    PrintRows( foundRows, "registros filtrados")

    foundRows = customerTable.Select()

    PrintRows( foundRows, "todos os registros")
End Sub

Private Sub PrintRows( rows() As DataRow, label As String)
    Console.WriteLine( "\n{0}", label )
 

    If rows.Length <= 0 Then
        Console.WriteLine( "nenhum registro encontrado" )
        Exit Sub
    End If
 

    Dim r As DataRow
    Dim c As DataColumn
 

    For Each r In rows
        For Each c In r.Table.Columns
            Console.Write( "\t {0}", r(c) )
        Next c
        Console.WriteLine()
    Next r
End Sub

 

Podemos acessar qualquer registro (linha) de qualquer tabela existente em um DataSet de forma aleatória usando o objeto Rows . Não existem mais os métodos MoveNext , MovePrevious , MoveLast, etc..

 

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

 

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