ADO.NET -  DataTable - Obtendo desempenho em consultas e ordenações


Acessar uma fonte de dados para obter informações é uma tarefa complexa que consome recursos e necessita ser bem planejada para não impactar a sua aplicação nos quesitos desempenho e segurança. Muitas vezes você precisa acessar tabelas com uma grande quantidade de registros apenas para obter uma única informação ou obter um subconjunto ordenado de registros.

Neste artigo eu vou mostrar uma forma de você efetuar o acesso a uma base de dados efetuar uma consulta e criar um DataTable desconectado para em seguida usar o método Select do DataTable e efetuar ordenações e filtragens nos registros, obtendo um sub-conjuntos de dados de forma eficaz.

Eu sempre procuro usar o Visual Basic 2005 Express Edition pois é grátis , então , abra o VB 2005 Express e crie um novo projeto do tipo Windows Appliction;

Altere o nome do formulário form1.vb para frmDados e defina no formulário o seguinte leiaute:

Componentes usados no formulário:

- 2 TextBox - txtDataSource e txtSQL

- 4 GroupBox - grpDados1, grpDados2, grpDados3 e grpDados4

- 4 ListBox - lstDados1, lstDados2, lstDados3 e lstDados4

- 4 Button - btnDados1, btnDados2, btnDados3 e btnDados4

Defina o seguinte namespace no projeto: Imports System.data.sqlclient

Defina as seguintes variáveis no início do formulário :

Dim oConn As New SqlConnection()
Dim oTable As New DataTable()
Dim oRows As DataRow()
Dim sConnectionString As String = ""

Ao carregar o formulário no evento Load vamos desabilitar os botões de comando :

Private Sub frmDados_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  btnDados2.Enabled = False
  btnDados3.Enabled = False
   btnDados4.Enabled = False
End Sub

Vamos agora ao código de cada um dos botões de comando:

1- Neste código é feito o acesso ao banco de dados e gerado um DataTable que em seguida é percorrido para exibir os valores das colunas CustomerID e ContactName em um controle ListBox.;

Private Sub btnDados1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDados1.Click
        Try
            oConn.ConnectionString = txtDataSource.Text
            oConn.Open()

            Dim oDA As New SqlDataAdapter(txtSQL.Text, oConn)
            oDA.Fill(oTable)
            oConn.Close()

            grpDados1.Text = oTable.Rows.Count & " registros ordenados por ContacName Crescente"

            For Each oRow As DataRow In oTable.Rows
                lstDados1.Items.Add(oRow("CustomerID").ToString() + vbTab + oRow("ContactName").ToString())
            Next
            btnDados2_.Enabled = True
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            If oConn.State = ConnectionState.Open Then
                oConn.Close()
            End If
        End Try
    End Sub

2 - O código a seguir usa o DataTable gerado para efetuar a ordenação pelo CustomerID no modo Ascendente preenchendo também um ListBox;

Private Sub btnDados2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDados2.Click
        Try
            oRows = oTable.Select(Nothing, "CustomerID ASC")

            grpDados2.Text = oTable.Rows.Count & " registros ordenados por CustomerID Crescente"

            For Each oRow As DataRow In oRows
                lstDados2.Items.Add(oRow("CustomerID").ToString() + vbTab + oRow("ContactName").ToString())
            Next
            btnDados3.Enabled = True
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            If oConn.State = ConnectionState.Open Then
                oConn.Close()
            End If
        End Try

    End Sub

3- No código abaixo usamos o mesmo DataTable para selecionar os CustomerID ALFKI e ANATR ordenando por ContactName ascendente;

Private Sub btnDados3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDados3.Click
        Try
            oRows = oTable.Select("CustomerID in ('ALFKI','ANATR')", "ContactName ASC")

            grpDados3.Text = oRows.Length & " registros selecionados e ordenados em ordem Crescente"

            For Each oRow As DataRow In oRows
                lstDados3.Items.Add(oRow("CustomerID").ToString() + vbTab + oRow("ContactName").ToString())
            Next
            btnDados4.Enabled = True
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            If oConn.State = ConnectionState.Open Then
                oConn.Close()
            End If
        End Try

    End Sub

4- O último código repete a seleção para os clientes com CustomerID igual a ALFKI','ANATR','BONA','WOLZA ','TRADH' e efetua a ordenação por CustomerID descendente;

Private Sub btnDados4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDados4.Click

        Try
            oRows = oTable.Select("CustomerID in ('ALFKI','ANATR','BONA','WOLZA ','TRADH')", "CustomerID DESC")

            grpDados4.Text = oRows.Length & " registros selecionados e ordenados em ordem Decrescente"

            For Each oRow As DataRow In oRows
                lstDados4.Items.Add(oRow("CustomerID").ToString() + vbTab + oRow("ContactName").ToString())
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            If oConn.State = ConnectionState.Open Then
                oConn.Close()
            End If
        End Try

    End Sub

O resultado pode ser visto na figura abaixo. Note que todas as operações foram realizadas em um mesmo DataTable gerado onde realizamos diversas operações sem ter que executar novas consultas no banco de dados ganhando assim desempenho.

Pegue o projeto completo aqui: dataTableNet.zip

Eu sei é apenas VB.NET mas eu gosto...


José Carlos Macoratti